Dateien per VBA öffnen

Es gibt viele Gelegenheiten, zu denen man gern eine Datei per VBA öffnen möchte. Ein gutes Beispiel ist ein soeben auf Basis eines Berichts erstelltes PDF-Dokument. Doch der Standardumfang von VBA liefert keine Möglichkeit, diese Aufgabe zu erledigen. Und tatsächlich ist das Anzeigen einer Datei nicht trivial, zumindest dann nicht, wenn wir vorher noch nicht wissen, welchen Dateityp die Datei hat und mit welcher Anwendung diese geöffnet werden soll. Allerdings weiß Windows ja auch meistens, mit welcher Anwendung eine Datei geöffnet werden soll, wenn wir diese im Windows Explorer doppelt anklicken. Also muss es einen Weg geben, diese Aufgabe per Code zu erledigen. Und die Lösung ist eine API-Funktion namens ShellExecute.

Beispieltabelle mit Dateiinformationen

Zu Beispielzwecken haben wir einer Datenbank eine Tabelle namens tblDateien hinzugefügt. Diese sieht wie in Bild 1 aus und enthält neben einer Bezeichnung den Namen von Dateien. Auf Pfadangaben haben wir der besseren Nutzbarkeit der Beispieldatenbank halber verzichtet und gehen davon aus, dass die angegebenen Dateien sich im gleichen Verzeichnis wie die Datenbank befinden. Auf diese Weise können wir in den folgenden Beispielen per Code unter Zuhilfenahme von CurrentProject.Path auf die Dateien zugreifen.

Tabelle mit Dateiangaben

Bild 1: Tabelle mit Dateiangaben

Formular zum Anzeigen der Beispieldateien

Um die Funktion zum Anzeigen der Dateien einfach aufrufen zu können, erstellen wir ein Formular, dass die Daten der Tabelle tblDateien anzeigt und eine Schaltfläche bereitstellt, mit der wir die Datei anzeigen können (siehe Bild 2). Diese Schaltfläche heißt cmdDateiOeffnen. Gleich fügen wir der Schaltfläche den Code zum Öffnen der Datei aus dem Feld Dateiname hinzu.

Entwurf eines Formulars zur Anzeige von Dateien in der jeweiligen Anwendung

Bild 2: Entwurf eines Formulars zur Anzeige von Dateien in der jeweiligen Anwendung

API-Funktion zum Anzeigen von Dateien

Für das Anzeigen von Dateien benötigen wir die API-Funktion ShellExecuteA. Diese deklarieren wir wie in Listing 1 in zweifacher Ausführung, einmal für Access-Versionen, die ein älteres VBA verwenden und einmal für die aktuellen Fassungen. Die Deklaration platzieren wir oben in einem neuen Standardmodul namens mdlDateienAnzeigen. Der Unterschied besteht in der Verwendung des Schlüsselworts PtrSafe sowie dem Datentyp LongPtr für den Parameter hWnd bei der Version für aktuelles VBA.

#If VBA7 Then
     Public Declare PtrSafe Function ShellExecuteA Lib "Shell32" (ByVal hWnd As LongPtr, ByVal lpOperation As String, _
       ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nCmdShow As Long) As Long
#Else
     Public Declare Function ShellExecuteA Lib "Shell32" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal _
        lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nCmdShow As Long) As Long
#End If

Listing 1: Deklaration der API-Funktion ShellExecute für 32-Bit und 64-Bit-VBA

Die Funktion erwartet einige Parameter, die wir uns hier anschauen:

  • hWnd: Erwartet ein Handle auf das aufrufende Fenster. Hier können wir den Wert 0 übergeben.
  • lpOperation: Erwartet eine Zeichenkette mit der auszuführenden Operation. Für unsere Aufgabe, eine Datei anzuzeigen, verwenden wir hier den Wert Open.
  • lpFile: Nimmt den Pfad zu der anzuzeigenden Datei entgegen.
  • lpParameters: Parameter, den wir hier nicht benötigen und deshalb mit vbNullString füllen
  • lpDirectory: Parameter, den wir hier nicht benötigen und deshalb mit vbNullString füllen
  • nCmdShow: Erwartet eine Konstante für den Anzeigemodus.

Die möglichen Werte für nCmdShow lauten:

  • SW_HIDE (0): Öffnet die Datei im versteckten Modus.
  • SW_MAXIMIZE (3): Öffnet das Fenster mit der Datei im maximierten Zustand.
  • SW_MINIMIZE (6): Zeigt das Fenster minimiert an.
  • SW_NORMAL (1): Aktiviert das Fenster beim Öffnen.
  • SW_SHOW (5): Einfache Anzeige.
  • SW_RESTORE (9): Stellt die Fenstergröße wieder her.
  • SW_SHOWMAXIMIZED (3): Zeigt das Fenster an und maximiert es.
  • SW_SHOWMINIMIZED (2): Zeigt das Fenster an und minimiert es.
  • SW_SHOWMINNOACTIVE (7): Minimiert das Fenster und aktiviert es nicht
  • SW_SHOWNA (8): Zeigt das Fenster an, aber aktiviert es nicht.
  • SW_SHOWNOACTIVATE (4): Zeigt das Fenster an, ohne es zu aktivieren.
  • SW_SHOWNORMAL (1): Zeigt das Fenster und aktiviert es.

Damit wir die Konstanten statt der Zahlenwerte angeben können, deklarieren wir diese oberhalb der API-Deklaration im gleichen Modul:

Public Const SW_HIDE = 0
Public Const SW_MAXIMIZE = 3
Public Const SW_MINIMIZE = 6
Public Const SW_NORMAL = 1
Public Const SW_SHOW = 5
Public Const SW_RESTORE = 9
Public Const SW_SHOWMAXIMIZED = 3
Public Const SW_SHOWMINIMIZED = 2
Public Const SW_SHOWMINNOACTIVE = 7
Public Const SW_SHOWNA = 8
Public Const SW_SHOWNOACTIVATE = 4
Public Const SW_SHOWNORMAL = 1

Rückgabewerte der API-Funktion ShellExecuteA

Die API-Funktion soll in unserem Fall zwar eigentlich nur eine Datei anzeigen, aber sie liefert auch noch einen Rückgabewert. Dieser kann die folgenden Werte annehmen – hier direkt in der Form, wie wir sie im Modul deklarieren wollen:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar