Excel 检查Word实例是否正在运行

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

我编写了ExcelVBA来检查Word的任何实例是否已经在运行,但是出现了一些问题

如果我在没有打开文档的情况下打开Word,那么如果Err.Number=0,那么wdAppRunning=True将返回False。 通过Windows开始打开Word

打开的Word实例

如果后台进程上运行Word实例,则该行也会返回False。 如果打开Word,创建或打开文档,然后运行宏,它将返回预期的结果True 我如何管理代码以至少识别第1种情况

注:链接中发布的代码返回相同的情况

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