Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在寻找使用excel vba检查可执行文件是否仍在运行的最快方法_Excel_Vba - Fatal编程技术网

正在寻找使用excel vba检查可执行文件是否仍在运行的最快方法

正在寻找使用excel vba检查可执行文件是否仍在运行的最快方法,excel,vba,Excel,Vba,我有一个检查可执行文件是否仍在运行的代码,但问题是,在检查可执行文件是否正在运行时,我发现它非常慢。有没有最快的方法 Public Function IsExeRunning(sExeName As String, Optional sComputer As String = ".") As Boolean On Error GoTo Error_Handler Dim objProcesses As Object Set objProcesses = GetO

我有一个检查可执行文件是否仍在运行的代码,但问题是,在检查可执行文件是否正在运行时,我发现它非常慢。有没有最快的方法

 Public Function IsExeRunning(sExeName As String, Optional sComputer As 
 String = ".") As Boolean
     On Error GoTo Error_Handler
     Dim objProcesses    As Object

Set objProcesses = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\cimv2").ExecQuery("SELECT * FROM Win32_Process WHERE Name  like '" & sExeName & "'") ' = '" & sExeName & "'")
If objProcesses.Count <> 0 Then IsExeRunning = True

Error_Handler_Exit:
     On Error Resume Next
     Set objProcesses = Nothing
     Exit Function

Error_Handler:
    MsgBox "The following error has occured." & vbCrLf & vbCrLf & _
        "Error Number: IsExeRunning" & vbCrLf & _
        "Error Description: " & Err.Description, _
        vbCritical, "An Error has Occured!"
     Resume Error_Handler_Exit
 End Function
公共函数正在运行(sExeName作为字符串,可选的sComputer作为字符串)
字符串=“.”)作为布尔值
关于错误转到错误处理程序
作为对象的Dim OBJ进程
设置objprocess=GetObject(“winmgmts:{impersonationLevel=impersonate}!\\”&scocomputer&“\root\cimv2”).ExecQuery(“从Win32\u进程中选择*,其中名称类似“&&sExeName&“””””=“&sExeName&“”)
如果objprocess.Count为0,则IsExeRunning=True
错误\u处理程序\u退出:
出错时继续下一步
设置objprocess=Nothing
退出功能
错误\u处理程序:
MsgBox“发生以下错误。”&vbCrLf&vbCrLf&_
“错误号:IsExeRunning”&vbCrLf&_
“错误说明:”&错误说明_
vbCritical,“发生错误!"
恢复错误\u处理程序\u退出
端函数

由于like查询的实现不太正确,这可能与您期望的不完全一样。我已经解决了这一问题,并添加了一些优化,主要是减少返回查询项的数量,添加了精确匹配方法,并添加了缓存方法,以在查询之前存储对计算机的引用

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
选项显式
'在我的机器上,功能平均为0.03秒
公共函数IsExeRunning(sExeName作为字符串_
可选的sComputer As String=“.”_
可选ExactMatch As Boolean=False)作为Boolean
关于错误转到错误处理程序
以静态计算机为对象
作为对象的模糊过程
Dim SearchQuery作为字符串
IsExeRunning=错误
'缓存计算机参考
如果计算机为Nothing或sComputer“”,则设置Computer=GetObject(“winmgmts:{impersonationLevel=impersonate}!\\”&sComputer&“\root\cimv2”)
'生成查询
如果你能匹配的话
SearchQuery=“从Win32中选择名称”\u进程,其中名称=”&sExeName&“
其他的
SearchQuery=“从Win32\u进程中选择名称,其中名称类似“%”和sExeName&“%”
如果结束
设置进程=Computer.ExecQuery(SearchQuery)
若进程为空,则退出函数
如果Process.Count=0,则退出函数
IsExeRunning=True
错误\u处理程序\u退出:
退出功能
错误\u处理程序:
恢复错误\u处理程序\u退出
端函数
子TestRunner()
把t调暗为单身
t=计时器
Debug.Print“Function returns”&IsExeRunning(“Excel”,“False”)和“take:”&Timer-t&“seconds”
端接头

<>代码>如果代码在运行,但你觉得可以有改进,然后考虑把它放上去。这是本文的主题。嗨,赖安,非常感谢你的回答。我已经通过创建一个DLL文件来解决这个问题,这将是对Excel VBA的参考。