Проверьте, работает ли экземпляр Word - PullRequest
0 голосов
/ 26 января 2020

Я написал Excel VBA, чтобы проверить, запущен ли какой-либо экземпляр Word, но возникают некоторые проблемы.

  1. Если я открываю Word без открытия документа, строка If Err.Number = 0 Then wdAppRunning = True возвращает False.

Открыть слово через Windows Пуск

enter image description here

Открытый экземпляр Word.

enter image description here

Если в фоновом процессе выполняется экземпляр Word, строка также возвращает False. Если я открою Word, создаю или открываю документ, а затем запускаю макрос, он возвращает ожидаемый результат (True)

Как управлять кодом, чтобы идентифицировать хотя бы ситуацию n ° 1?

Ps .: код, размещенный в ссылке Получение экземпляров Word и сохранение документов возвращает ту же ситуацию.

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

Ответы [ 3 ]

0 голосов
/ 27 января 2020

В качестве альтернативы вы можете попробовать с

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
0 голосов
/ 27 января 2020

Нечто подобное должно работать.

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

Пример использования

Public Sub Example()
    Debug.Print IsProcessRunning("WINWORD.EXE")
End Sub

Убедитесь, что имя, указанное в IsProcessRunning(), является именем, которое отображается в диспетчере задач.

0 голосов
/ 26 января 2020

Попробуйте это

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...