Dokumente

FindExecutable

Ermittelt, welches ausführbare Programm ein Dokument standardmäßig ausführt. In VBA kann das für die Shell-Funktion hilfreich sein.

Mit dem Parameter lpDirectory kann ein Arbeitsverzeichnis angegeben werden.

War die Funktion erfolgreich, ist der Rückgabewert größer als 32. Kleinere Werte sind Fehlercodes. Da ShellExecute identische Fehlercodes hat, sind sie der Einfachheit halber nur dort aufgeführt.

#If VBA7 Then
    Private Declare PtrSafe Function FindExecutableA Lib "Shell32" _
        (ByVal lpFile As String, ByVal lpDirectory As String, _
         ByVal lpResult As String) As LongPtr
#Else
    Private Declare Function FindExecutableA Lib "Shell32" _
        (ByVal lpFile As String, ByVal lpDirectory As String, _
         ByVal lpResult As String) As Long
#End If

Public Function
apiFindExecutable(strFile As String) As String Dim strResult As String strResult = String(255, vbNullChar) FindExecutableA strFile, vbNullString, strResult apiFindExecutable = Replace(strResult, vbNullChar, "") End Function

ShellExecute

Öffnet ein beliebiges Dokument, das mit dem Parameter lpFile übergeben wird. Das Dokument wird mit der Anwendung geöffnet, die standardmäßig dafür vorgesehen ist. Es kann sich z. B. um ein Worddokument oder ein Excelsheet handeln, aber genauso auch beispielsweise PDF oder MP3, um Musik abzuspielen oder PDFs zu drucken.

Wie genau das Dokument von der Standardanwendung behandelt wird, hängt vom Paramenter lpOperation ab. Folgende Werte sind möglich:

In lpFile kann auch eine ausführbare Anwendung angegeben werden, um sie zu starten. Im Parameter lpParameters kann dann ein Dokument angegeben werden, das in dieser Anwendung gestartet wird. Allerdings ist das einfacher mit der Shell-Anweisung umsetzbar.

Als Dateiname kann auch ein URI oder ein „Pseudo-URI“ wie about:blank verwendet werden. Damit wird der Standardbrowser gestartet und die Webadresse angezeigt. Es ist auch möglich, das Mailprogramm aufzurufen und voreingestellte Werte für eine Mail zu übergeben (siehe die Beispielfunktion demoMail).

Mit dem Parameter lpDirectory kann ein Arbeitsverzeichnis angegeben werden, und mit hWnd kann ein Verweis zu einem schon geöffneten Fenster hergestellt werden.

War die Funktion erfolgreich, ist der Rückgabewert größer als 32. Kleinere Werte sind Fehlercodes.

#If VBA7 Then
    Private 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 nShowCmd As eShowCmd) As Long
#Else
    Private 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 nShowCmd As eShowCmd) As Long
#End If

Public Enum eShowCmd
    SW_HIDE = 0             'Blendet Fenster aus und aktiviert ein anderes Fenster
    SW_MAXIMIZE = 3         'Maximiert Fenster und aktiviert es
    SW_MINIMIZE = 6         'Minimiert Fenster und aktiviert ein anderes Fenster
    SW_RESTORE = 9          'Aktiviert bisher minimiertes Fenster in aktueller Größe
    SW_SHOW = 5             'Aktiviert Fenster in aktueller Größe
    SW_SHOWDEFAULT = 10     'Aktiviert Fenster in ursprünglicher Größe
    SW_SHOWMINIMIZED = 2    'Minimiert Fenster und aktiviert es
    SW_SHOWMININOACTIVE = 7 'Minimiert Fenster. Das aktive Fenster bleibt aktiv
    SW_SHOWNA = 8           'Fenster in aktueller Größe. Aktives Fenster bleibt aktiv
    SW_SHOWNOACTIVATE = 4   'Fenster in neuer Größe. Das aktive Fenster bleibt aktiv
    SW_SHOWNORMAL = 1       'Aktiviert Fenster. Falls schon min/maximiert, normale Größe
End Enum

Public Function
apiShellExecute(file As String, _ Optional operation As String = "open", _ Optional fenster As eShowCmd = SW_SHOWNORMAL) As String Dim lngResult As Long, strErr As String strErr = "" lngResult = ShellExecuteA(0, operation, file, vbNullString, vbNullString, fenster) Select Case lngResult Case 0: strErr = "Nicht genügend Speicher" Case 2: strErr = "Datei nicht gefunden" Case 3: strErr = "Pfad nicht gefunden" Case 5: strErr = "Zugriff verweigert" Case 26: strErr = "Zugriff gesperrt" Case 31: If operation = "print" Then strErr = "Datei kann nicht ausgedruckt werden" Else strErr = "Datei ist nicht assoziiert" End If Case Else If lngResult < 32 Then strErr = "sonstiger Fehler" End If End Select apiShellExecute = strErr End Function
Public Sub
demoMail(mailto As String, subject As String, body As String) Do Until InStr (2, mailto, "@") mailto = InputBox("Geben Sie eine gültige Mailadresse ein!") Loop body = Replace(body, vbNewLine, "%0D%0A") ShellExecuteA 0, "Open", "mailto:" & mailto & "?subject=" & subject & "&body=" & body, _ vbNullString, vbNullString, SW_SHOWNORMAL End Sub