Ukončení konkrétní instance Excelu   zodpovězená otázka

VB.NET, Office

Zdravím. Mám spuštěných několik instancí programu Excel. Spustím další, po proběhnutí procedury která nahází data do sešitu v Excelu potřebuju ukončit pouze tu jedinou instanci (ostatní instance v Excelu poběží dál). Momentálně mi to funguje tak, že zkontroluju, zda v paměti neběží Excel, pokud ano, uživatel je upozorněn, že má Excel ukončit (všechny jeho instance). Po skončení ukládání do Excelu program na základě jména procesu opět sjede spuštěné programy a ukončí všechny případně spuštěné procesy s názvem Excel. Zkoušel jsem udělat jednorozměrné pole, do něj načíst číselná ID všech spuštěných procesů Excel, spustit novou úlohu a potom projet pole a porovnat ID všech běžících Excelů a ukončit pouze ten nově spuštěný. Nějak se mi to ale nedaří. Nápady, návrhy, kus kódu by nebyl? Díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevím, je-li to zrovna nejlepší způsob kooperace s Excelem, ale například ten Váš postup mi docela dobře funguje. Kód by mohl vypadat třeba nějak takto:

ublic Class Form1

    ' proměnná pro seznam běžících procesů Excelu (kolekce)
    Private exc As New List(Of Integer)


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim proc As Diagnostics.Process

        ' pro všechny procesy typu "EXCEL" uložíme do kolekce exc jejich ID
        For Each proc In Diagnostics.Process.GetProcesses()

            If proc.ProcessName = "EXCEL" Then
                exc.Add(proc.Id)
            End If

        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim proc As Diagnostics.Process

        ' v okamžiku, kdy chceme ty nově otevřrné procesy odstřelit, projdeme všechny procesy
        ' a procesy typu EXCEL, jejichž ID není obsaženo v na začátku zjištěné kolekci "odstřelíme" 
        For Each proc In Diagnostics.Process.GetProcesses()
            If proc.ProcessName = "EXCEL" And Not exc.Contains(proc.Id) Then proc.CloseMainWindow()
        Next

    End Sub
End Class

Jak jsem napsal, neznám Vaše konkrétní představy, ale výše popsaný kód mi uzavírá všechnu instance Excelu, které byly otevřeny mezi spuštěním kódu a zmáčknutím tlačítla Button1.

Samozřejmě v případě změn v uzavíraném excelu si to vyžádá od uživatele ještě potvrzení (abyste mu neodstřelil nějaký jiný excel, který si náhodou taky v té době otevřel).

Pokud byste chtěl jít do tohoto rizika a chtěl se vyhnout potvrzování, můžete místo metody v tom posledním IF-u

proc.CloseMainWindow()

použít "drsnější" variantu

proc.Kill()

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Kód funguje bezvadně, DÍKY! Nemusel bych nic ukončovat, kdyby mi nezůstával viset spuštěný proces Excel v paměti po dokončení vkládání dat do sešitu a jeho uložení (a řádném uzavření objektu - "xl.quit" a "xl=nothing"). Volím variantu proc.kill(), otevření a uzavření Excelu je součástí několika poměrně rychlých procedur a myslím si, že uživatel nemá šanci za takhle krátkou dobu spustit nový "nezjištěný" Excel a něco v něm provádět. Ještě jednou díky, moc jste mi pomohl.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback