VBA终止IE进程时遇objProcess.Terminate未找到错误求助
解决VBA终止IE进程时的“未找到”错误
首先,你遇到的这个“未找到”错误,大概率是因为在遍历WMI进程集合的过程中直接终止进程,导致集合的动态变化破坏了遍历逻辑。当你调用objProcess.Terminate后,被终止的进程会从WMI的进程集合中移除,后续的For Each循环尝试访问已经不存在的进程对象,就会抛出这个错误。
修正方案:先收集所有目标进程的ID,再逐个终止
我们可以先把所有iexplore.exe进程的ProcessID提取到一个数组里,然后通过ProcessID单独获取进程对象并终止,这样就不会受集合动态变化的影响。
修正后的代码如下:
Sub IE_kill() Dim objWMI As Object, objProcess As Object, objProcesses As Object Dim processIDs() As Variant Dim i As Integer Set objWMI = GetObject("winmgmts://.") Set objProcesses = objWMI.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'iexplore.exe'") ' 先把所有进程ID存入数组 If objProcesses.Count > 0 Then ReDim processIDs(1 To objProcesses.Count) i = 1 For Each objProcess In objProcesses processIDs(i) = objProcess.ProcessID i = i + 1 Next objProcess ' 遍历数组,通过ID获取进程并终止 For i = LBound(processIDs) To UBound(processIDs) Set objProcess = objWMI.Get("Win32_Process.Handle='" & processIDs(i) & "'") If Not objProcess Is Nothing Then On Error Resume Next ' 捕获可能的错误(比如进程已被其他程序关闭) objProcess.Terminate On Error GoTo 0 End If Set objProcess = Nothing Next i End If Set objProcesses = Nothing Set objWMI = Nothing End Sub
额外说明:
- 加入
On Error Resume Next是为了防止某些进程在我们收集ID后、终止前已经被系统或其他程序关闭,避免再次触发“未找到”错误。 - 先收集ID再处理的方式,彻底避开了直接遍历动态集合的坑——WMI的进程集合是实时同步系统进程状态的,进程被终止后集合内的对应元素会立即失效,直接遍历很容易出问题。
内容的提问来源于stack exchange,提问作者Dmitrij Holkin
相关产品推荐
相关产品推荐

