VBA中提供了CreateObject
和GetObject
两种方法获得对象实例,二者的区别在于GetObject
用于获取已经打开的应用程序对象,但是如果该应用程序并没有打开,那么将产生运行时错误,代码中需要加入额外的错误处理代码。
在任务管理器中可以轻松的查看当前已经打开的应用程序,如下图所示。
使用VBA也可以通过进程名称查找应用程序实例,示例代码如下。
Function blnCheckProcess(strProcess As String) As Boolean
Dim objWMIService As Object
Dim strSql As String
Dim objProcessList As Object
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
strSql = Replace("select * from Win32_Process where Name='x' ", "x", strProcess)
Set objProcessList = objWMIService.ExecQuery(strSql)
blnCheckProcess = (objProcessList.Count > 0)
Set objWMIService = Nothing
Set objProcessList = Nothing
End Function
Sub Demo()
Dim strProcess As String
Dim strMsg As String
strProcess = "winword.exe"
If blnCheckProcess(strProcess) Then
strMsg = strProcess & " 已经打开"
' 其他处理代码
Else
strMsg = strProcess & " 尚未打开"
End If
MsgBox strMsg
End Sub
【代码解析】
第5行代码调用GetObject
过去WMI对象。
第6行代码创建用于查询Windows进程的sql语句,其中使用Replace
替换语句中的进程名称。
第7行调用ExecQuery
运行查询语句。
第8行代码将objProcessList.Count > 0
设置为函数返回值,即如果objProcessList
不为空,返回值为True,否则返回值为False。
第9~10行代码清空对象变量占用的系统资源。
第12~23行代码为演示代码过程。
第15行代码指定应用程序进程名称,不区分大小写,但是名称不一定和大家想象的相同,例如Office中的Word,其进程名称是winword.exe
(参见插图1),于Excel相比,前面多了win
。
第16行代码调用blnCheckProcess
查询进程。
第22行代码显示提示信息,如下图所示。