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()
|