Anwendung in Excel pausieren, bis ein Prozess beendet ist
Schritt-für-Schritt-Anleitung
Um Dein Makro in Excel so zu gestalten, dass es wartet, bis ein bestimmter Prozess beendet ist, kannst Du die folgenden Schritte befolgen. Diese Methode nutzt die Windows Management Instrumentation (WMI), um den Status eines Prozesses zu überprüfen.
-
Öffne den VBA-Editor:
-
Füge ein neues Modul hinzu:
- Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)", gehe auf "Einfügen" und wähle "Modul".
-
Füge den folgenden Code ein:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Function CheckProcess(strProgName As String) As Boolean
Dim objWMIService As Object, objProcess As Object
Dim booProcess As Boolean
Set objWMIService = GetObject("winmgmts:")
strProgName = LCase(strProgName)
Set objProcess = objWMIService.ExecQuery("Select * from Win32_Process")
For Each proc In objProcess
If LCase(proc.Name) Like strProgName Then
CheckProcess = True
Exit Function
End If
Next
CheckProcess = False
End Function
Sub WaitForProcess()
Do While CheckProcess("SW9C.exe")
DoEvents
Sleep 200
Loop
MsgBox "Der Prozess SW9C.exe wurde beendet."
End Sub
-
Führe das Makro aus:
- Du kannst das Makro
WaitForProcess
mit einem Button oder beim Öffnen der Datei ausführen.
Häufige Fehler und Lösungen
Fehler 1: Der Prozess wird nicht erkannt.
- Lösung: Stelle sicher, dass der Prozessname korrekt geschrieben ist, einschließlich der Dateiendung (z.B.
SW9C.exe
).
Fehler 2: Das Makro läuft endlos.
- Lösung: Überprüfe, ob der Prozess tatsächlich gestartet wurde. Wenn der Prozess nicht existiert, wird die Schleife niemals beendet.
Alternative Methoden
Eine alternative Methode, um auf einen Prozess zu warten, ist die Verwendung der FindWindow
-Funktion, die auf Fenster-Handles basiert. Dies kann nützlich sein, wenn die Anwendung ein sichtbares Fenster hat.
Hier ein Beispiel, wie Du dies umsetzen kannst:
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub WaitForWindow()
Dim hwnd As Long
Do
hwnd = FindWindow(vbNullString, "Titel des Fensters")
DoEvents
Sleep 200
Loop While hwnd = 0
MsgBox "Das Fenster ist jetzt sichtbar."
End Sub
Praktische Beispiele
Du kannst das obige Beispiel anpassen, um auf verschiedene Prozesse zu warten. Zum Beispiel, wenn Du auf den Prozess firefox.exe
warten möchtest, ersetze SW9C.exe
durch firefox.exe
in der Funktion CheckProcess
.
Tipps für Profis
- Optimierung: Reduziere die Wartezeit in der Schleife (z.B. auf 100 ms), um die Reaktionsfähigkeit Deines Makros zu verbessern.
- Debugging: Verwende
Debug.Print
zur Ausgabe von Informationen in das Direktfenster, um den Status Deines Prozesses zu überwachen.
FAQ: Häufige Fragen
1. Wie kann ich das Makro automatisch beim Öffnen der Datei ausführen?
Du kannst das Makro in die Workbook_Open
-Ereignisprozedur einfügen:
Private Sub Workbook_Open()
Call WaitForProcess
End Sub
2. Funktioniert das Makro auch in Excel 2016?
Ja, der bereitgestellte Code sollte in Excel 2016 und höher ohne Anpassungen funktionieren. Achte darauf, dass die richtigen Berechtigungen für die WMI-Anfragen gesetzt sind.