Beitrag aus SmartTools Access Weekly
Externes Programm per VBA aus Access ausführen und warten
Access 365 2024 2021 2019 2016 2013 2010
FRAGE Meine Datenbank muss mit einer anderen Anwendung zusammenarbeiten. Ich möchte eine externe Verarbeitung aus Access anstoßen und dann das Ergebnis verarbeiten. Aus einer VBA-Prozedur heraus soll daher ein externes Programm gestartet werden. Das ist grundsätzlich kein Problem, aber die VBA-Prozedur muss dann so lange warten, bis das externe Programm beendet wird und erst danach weiterlaufen. Haben Sie eine Lösung dafür?
H. Riemer
ANTWORT Hier helfen API-Funktionen weiter:
- Wechseln Sie mit Alt + F11 in die VBA-Entwicklungsumgebung.
- Legen Sie ein neues Modul an und benennen Sie es "modShellWait".
- Kopieren Sie die folgenden Deklarationen und die Funktion "ShellWait()" in das Modul:
Private Const STILL_ACTIVE = &H103&
Private Const PROCESS_QUERY_INFORMATION = &H400&
Private Declare Function OpenProcess _
Lib "kernel32" ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess _
Lib "kernel32" ( _
ByVal hProcess As Long, _
lpExitCode As Long) As Long
Private Declare Function CloseHandle _
Lib "kernel32" ( _
ByVal hObject As Long) As Long
Public Function ShellWait( _
ByVal PathName As String, _
Optional ByVal WindowStyle _
As VbAppWinStyle = vbMinimizedFocus, _
Optional ByVal Events _
As Boolean = True) As Long
Dim ID As Long, H As Long
ID = Shell(PathName, WindowStyle)
H = OpenProcess(PROCESS_QUERY_INFORMATION, True, ID)
Do
If Events Then DoEvents
GetExitCodeProcess H, ShellWait
Loop While ShellWait = STILL_ACTIVE
CloseHandle H
End Function
- Speichern Sie die Änderungen.
In Zukunft können Sie ein externes Programm per ShellWait() starten. Erst nach Beendigung der Funktion wird Ihr Code weiter ausgeführt, wie sich mit folgender Testprozedur schnell überprüfen lässt:
Sub Test()
Dim R&
R = ShellWait("calc.exe")
MsgBox "Nun gehts weiter..."
End Sub
Zur Funktionsweise: Die VBA-Funktion "Shell()" liefert eine Prozess-ID als Rückmeldung. Mit dieser ID können wir per "OpenProcess()" einen Zugriff auf den Prozess des laufenden Programms initialisieren und per "GetExitCodeProcess()" den aktuellen Status in einer Schleife abfragen. Solange der Exitcode "STILL_ACTIVE" ist, läuft das Programm noch und die Schleife wird weiter ausgeführt. Andernfalls ist das Programm beendet worden, die Schleife terminiert und die Kontrolle geht an die aufrufende Prozedur zurück.