2017-05-24 170 views
3
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  

嘗試使用此方法在運行某些從基於Web的服務器檢索數據的函數之前關閉所有Explorer實例,但在嘗試運行時遇到問題用多個標籤關閉一個打開的瀏覽器。如果用戶只有一個IE窗口(一個選項卡)打開,那麼它關閉它就好了,繼續前進;如果這些用戶有多個窗口單獨打開(不是在一個窗口中選項卡),那麼它關閉它們都很好,然後繼續;但由於某種原因,如果一個窗口打開多個選項卡,則出現運行時錯誤'-2147217406(80041002)':「未找到」。任何幫助解決這個問題將不勝感激。通過VBA終止所有資源管理器實例 - Excel

+0

一個快速骯髒的方式是圍繞'objProcess.Terminate'包裝'On Error Resume Next'和'On Error GoTo 0'。我在我的機器上進行了調試,發現第一個Terminate調用一次關閉了所有窗口,無論他們是否打開了多個選項卡。也許只是做一次並退出循環。 –

回答

1

不是你問什麼,但使用PowerShell和包括一個選項(從here另一種方法來關閉窗口只有在IE瀏覽器一直打開的時間超過X秒。

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

此問題是由引起IE瀏覽器有1個主要的實例,並且每個標籤頁都有一個新的進程iexplore 因此,當主主機實例關閉時,所有與標籤相關的進程都關閉 它會導致代碼中的錯誤,因爲你正在枚舉的集合是來自早期狀態的狀態快照,並且你正試圖關閉不存在的任何進程。在TaskManager中保存。

現在回答如何提高你的代碼(對錯誤恢復過程簡單接下來也將有所幫助,但退出後首先關閉,如果用戶有多個會話打開實例可能是不夠的):

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 
+0

我試過這個,但得到了同樣的問題 – Selrac