通过VBA终止所有浏览器实例 – Excel

Private Sub CommandButton1_Click() Dim objWMI As Object, objProcess As Object, objProcesses As Object Set objWMI = GetObject("winmgmts://.") Set objProcesses = objWMI.ExecQuery("Select * FROM Win32_Process Where Name = 'iexplore.exe'") For Each objProcess In objProcesses objProcess.Terminate Next Set objProcesses = Nothing Set objWMI = Nothing Unload WebForm End Sub 

尝试使用这种方式来closures所有Explorer的实例,然后运行一些从基于Web的服务器检索数据的函数,但是当它尝试closures带有多个选项卡的打开的浏览器时遇到问题。 如果用户只有一个IE窗口(一个选项卡)打开,那么它closures它就好了,继续前进; 如果这些用户有多个窗口单独打开(不是在一个窗口中选项卡),那么它closures它们都很好,然后继续; 但由于某种原因,如果一个窗口打开多个选项卡,那么我得到运行时错误'-2147217406(80041002)':“未find”。 任何帮助,通过这将不胜感激。

不完全是你问,但另一种方法,使用powershell,并包括一个选项(从这里closures窗口只有在IE打开超过X秒的地方。

 Sub Comesfast() X2 = Shell("powershell.exe get-process iexplore | ? { ([DateTime]::Now - $_.StartTime).TotalSeconds -gt 05 } | stop-process", 1) End Sub 

这个问题是由IE浏览器如何处理标签引起的。 有1个IE的主要实例,并为每个选项卡创build新的进程iexplore。 因此,当主主机实例closures时,所有与制表符相关的进程都将closures。 它会导致代码中的错误,因为你正在枚举的集合是来自之前状态的状态的快照,并且你试图closures不再存在的进程。 这可以在TaskManager中观察到。

现在回答如何改进你的代码(当然,简单的错误恢复接下来也会有所帮助,但是如果用户打开了更多的会话,则在第一次closures实例后退出可能是不够的):

 Private Sub CommandButton1_Click() Dim objWMI As Object, objProcess As Object, objProcesses As Object Do Set objWMI = GetObject("winmgmts://.") Set objProcesses = objWMI.ExecQuery("Select * FROM Win32_Process Where Name = 'iexplore.exe'") If objProcesses.Count > 0 Then For Each objProcess In objProcesses objProcess.Terminate Exit For Next End If Loop While objProcesses.Count > 0 Set objProcesses = Nothing Set objWMI = Nothing Unload WebForm End Sub