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
Ö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:
open
öffnet das Dokumentedit
öffnet das Dokument zur Bearbeitung (je nach Dokumenttyp kein
Unterschied zu open
, aber z. B. bei HTML-Dateien gut zu
sehen)print
druckt das Dokument auf dem Standarddrucker (wird in der
Praxis häufig mit ausgeblendetem Fenster eingesetzt, aber nicht alle
Anwendungen lassen sich dabei vollständig ausblenden)printto
(nicht mit allen Dokumenttypen möglich) druckt das Dokument
auf einem beliebigen Drucker. Der Druckername
muss im Parameter lpParameters
angegeben werdenexplore
öffnet den Windows-Explorer mit dem Ordner, der als Datei
angegeben istfind
startet die Dateisuche in dem Ordner, der als Datei
angegeben istvbNullString
öffnet das Dokument so, wie es standardmäßig vorgesehen
ist (meistens open
)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