Это может работать не совсем так, как вы ожидаете, поскольку подобный запрос не совсем правильно реализован. Я исправил это и добавил несколько оптимизаций, в основном уменьшив количество возвращаемых условий запроса, добавив метод точного соответствия и добавив метод кэширования для сохранения ссылки на компьютер перед запросом.
Option Explicit
'Function averages 0.03 seconds on my machine
Public Function IsExeRunning(sExeName As String, _
Optional sComputer As String = ".", _
Optional ExactMatch As Boolean = False) As Boolean
On Error GoTo Error_Handler
Static Computer As Object
Dim Process As Object
Dim SearchQuery As String
IsExeRunning = False
'Cache Computer reference
If Computer Is Nothing Or sComputer <> "." Then Set Computer = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\cimv2")
'Build query
If ExactMatch Then
SearchQuery = "SELECT Name FROM Win32_Process WHERE Name = '" & sExeName & "'"
Else
SearchQuery = "SELECT Name FROM Win32_Process WHERE Name like '%" & sExeName & "%'"
End If
Set Process = Computer.ExecQuery(SearchQuery)
If Process Is Nothing Then Exit Function
If Process.Count = 0 Then Exit Function
IsExeRunning = True
Error_Handler_Exit:
Exit Function
Error_Handler:
Resume Error_Handler_Exit
End Function
Sub TestRunner()
Dim t As Single
t = Timer
Debug.Print "Function returns " & IsExeRunning("Excel", ".", False) & " took: " & Timer - t & " seconds"
End Sub