Excel 检查Word实例是否正在运行
我编写了ExcelVBA来检查Word的任何实例是否已经在运行,但是出现了一些问题 如果我在没有打开文档的情况下打开Word,那么如果Err.Number=0,那么wdAppRunning=True将返回False。 通过Windows开始打开Word 打开的Word实例 如果后台进程上运行Word实例,则该行也会返回False。 如果打开Word,创建或打开文档,然后运行宏,它将返回预期的结果True 我如何管理代码以至少识别第1种情况 注:链接中发布的代码返回相同的情况Excel 检查Word实例是否正在运行,excel,vba,ms-word,Excel,Vba,Ms Word,我编写了ExcelVBA来检查Word的任何实例是否已经在运行,但是出现了一些问题 如果我在没有打开文档的情况下打开Word,那么如果Err.Number=0,那么wdAppRunning=True将返回False。 通过Windows开始打开Word 打开的Word实例 如果后台进程上运行Word实例,则该行也会返回False。 如果打开Word,创建或打开文档,然后运行宏,它将返回预期的结果True 我如何管理代码以至少识别第1种情况 注:链接中发布的代码返回相同的情况 Sub wdAppR
Sub wdAppRunning()
Dim wdApp As Object
Dim wdAppRunning As Boolean
On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err.Number = 0 Then wdAppRunning = True
MsgBox wdAppRunning
Set wdApp = Nothing
End Sub
试试这个
Public Function Is_Word_Running() As Boolean
Dim Wrd As Object
On Error Resume Next
Set Wrd = GetObject(, "Word.Application")
On Error GoTo 0
Is_Word_Running = Not Wrd Is Nothing
End Function
或者你也可以试着用它
Public Function Is_Word_Running() As Boolean
Dim WMG As Object, Proc As Object
Is_Word_Running = False
Set WMG = GetObject("winmgmts:")
For Each Proc In WMG.InstancesOf("win32_process")
If UCase(Trim(Proc.Name)) = "WINWORD.EXE" Then
Is_Word_Running = True
Exit For
End If
Next Proc
Set WMG = Nothing
End Function
这样的办法应该行得通
Option Explicit
Public Function IsWordRunning() As Boolean
IsWordRunning = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'WINWORD.EXE'").Count > 0
End Function
Public Sub Example()
Debug.Print IsWordRunning()
End Sub
一个快速的好处是,如果您愿意,可以扩展为一个可执行文件名
Public Function IsProcessRunning(ExecutableName As String) As Boolean
IsProcessRunning = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & ExecutableName & "'").Count > 0
End Function
示例用法
确保您在IsProcessRunning中指定的名称是任务管理器中显示的名称。这是否回答了您的问题?如果我打开Word而不打开文档,你的意思是什么?这也会有助于你在错误恢复上发表评论,然后找出产生了什么错误。没有这些信息,一切都是猜测。另外,当您看到此行为时,有多少Word实例正在运行?如果不确定,请使用Windows任务管理器并查看进程列表。我猜不止一个,这可以解释这种行为。@FaneDuru,如果我在没有打开文档的情况下打开Word,意味着我使用Windows“开始”菜单打开Word应用程序。但我认为这是显而易见的。使用您的代码,您正在寻找一个已经打开的Word会话!如果不存在这样的会话,则返回False是正常的。在这种情况下,尝试从一个不存在的对象创建一个对象,您会期望什么?抱歉,但结果相同。如果我通过Windows Start打开Word,而不打开文档,函数将返回False。您的代码工作得很好,但由于@Ryan Wildry代码更紧凑,我将设置他作为答案。但再一次,非常感谢!!!这两种建议在所有测试情况下都非常有效。由于我是VBA新手,我将投入一些时间来理解代码。非常感谢!!!
Public Sub Example()
Debug.Print IsProcessRunning("WINWORD.EXE")
End Sub