News & Tipps zu Microsoft Access

Lesen Sie hier einige der besten Beiträge aus SmartTools Access Weekly sowie ausgewählte Inhalte anderer E-Mail-Newsletter von SmartTools Publishing rund um Microsoft Access.

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:

  1. Wechseln Sie mit Alt + F11 in die VBA-Entwicklungsumgebung.
  2. Legen Sie ein neues Modul an und benennen Sie es "modShellWait".
  3. 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
  1. 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.