VBA Tipp: Anwendung mit ShellExecute starten

Aus DBWiki
Wechseln zu: Navigation, Suche

Problem

Ich möchte eine Anwendung starten, aber der Shell-Befehl von VBA reicht mir nicht aus, da ich

  • nur den Pfad der zu öffnenden Datei kenne, aber nicht den Pfad der Anwendung selbst
  • und/oder ein Ausführungsverzeichnis vorgeben möchte.

Die Funktion gibt einen Long-Wert größer 32 zurück, wenn der Versuch erfolgreich war.

Lösung

Die API-Funktion ShellExecute bietet diese Möglichkeiten. Sie wird in einem globalen Modul hinterlegt.

'Konstanten für den Parameter "nshowcmd"
Public Const SW_HIDE            As Long = 0   ' Blendet das Fenster aus und aktiviert ein
                                              ' weiteres Fenster.
Public Const SW_SHOWNORMAL      As Long = 1   ' Aktiviert und zeigt ein Fenster an. Wenn
                                              ' das Fenster verkleinert oder maximiert wird,
                                              ' stellt Windows es auf seine ursprüngliche
                                              ' Größe und Position zurück.  Eine Anwendung
                                              ' sollte dieses Flag bei der ersten Anzeige
                                              ' des Fensters angeben.
Public Const SW_NORMAL          As Long = 1   ' dito
Public Const SW_SHOWMINIMIZED   As Long = 2   ' Aktiviert das Fenster und zeigt es als
                                              ' minimiertes Fenster an.
Public Const SW_SHOWMAXIMIZED   As Long = 3   ' Aktiviert das Fenster und zeigt es als
                                              ' maximiertes Fenster an.
Public Const SW_MAXIMIZE        As Long = 3   ' dito
Public Const SW_SHOWNOACTIVATE  As Long = 4   ' Zeigt ein Fenster in seiner jüngsten Größe
                                              ' und Position an. Das aktive Fenster bleibt
                                              ' aktiv.
Public Const SW_SHOW            As Long = 5   ' Aktiviert das Fenster und zeigt es in seiner
                                              ' aktuellen Größe und Position an.
Public Const SW_MINIMIZE        As Long = 6   ' Minimiert das angegebene Fenster und aktiviert
                                              ' das nächste Fenster der obersten Ebene in der
                                              ' z-Reihenfolge.
Public Const SW_SHOWMINNOACTIVE As Long = 7   ' Zeigt das Fenster als minimiertes Fenster an.
                                              ' Das aktive Fenster bleibt aktiv.
Public Const SW_SHOWNA          As Long = 8   ' Zeigt das Fenster in seinem aktuellen Zustand
                                              ' an.  Das aktive Fenster bleibt aktiv.
Public Const SW_RESTORE         As Long = 9   ' Aktiviert und zeigt das Fenster an. Wenn das
                                              ' Fenster verkleinert oder maximiert wird, stellt
                                              ' Windows es auf seine ursprüngliche Größe und
                                              ' Position zurück.  Eine Anwendung sollte dieses
                                              ' Flag beim Wiederherstellen eines minimierten
                                              ' Fensters angeben.
Public Const SW_SHOWDEFAULT     As Long = 10  ' Setzt den Show-Status basierend auf dem SW_Flag,
                                              ' das in der STARTUPINFO-Struktur angegeben ist,
                                              ' die von dem Programm, das die Anwendung gestar-
                                              ' tet hat, an die CreateProcess-Funktion über-
                                              ' geben wurde.  Eine Anwendung sollte ShowWindow
                                              ' mit diesem Flag aufrufen, um den anfänglichen
                                              ' Show-Status ihres Hauptfensters zu setzen.
Public Const SW_FORCEMINIMIZE   As Long = 11  ' Minimiertes anzeigen erzwingen.
Public Const SW_MAX             As Long = 11
 
'Quelle: www.dbwiki.net oder www.dbwiki.de
 
Public Declare Function ShellExecute Lib "shell32.dll" _
   Alias "ShellExecuteA" ( _
   ByVal hWnd As Long, _
   ByVal lpOperation As String, _
   ByVal lpFile As String, _
   ByVal lpParameters As String, _
   ByVal lpDirectory As String, _
   ByVal nshowcmd As Long) As Long

Konstanten

Für den Parameter nshowcmd gibt es folgende Konstanten:

Konstante Wert Aktion
SW_HIDE 0 Verbirgt das Fenster und aktiviert ein anderes.
SW_MAXIMIZE 3 Maximiert das angegebene Fenster.
SW_MINIMIZE 6 Minimiert das angegebene Fenster und aktiviert das nächste Hauptfenster in der Z-Reihenfolge.
SW_RESTORE 9 Aktiviert und zeigt das Fenster. Wenn das Fenster minimiert oder maximiert ist, dann stellt das System das Fenster in seiner Originalgröße und -position wieder her. Eine Anwendung sollte dieses Flag setzen, wenn sie ein Fenster wiederherstellt.
SW_SHOW 5 Aktiviert und zeigt das Fenster in seiner gegenwärtigen Position und Größe.
SW_SHOWDEFAULT 10 Setzt den Fensterstatus eines Fensters entsprechend dem SW_-Wert der aufrufenden Applikation.
SW_SHOWMAXIMIZED 3 Aktiviert das Fenster und zeigt es maximiert an.
SW_SHOWMINIMIZED 2 Aktiviert das Fenster und zeigt es minimiert an.
SW_SHOWMINNOACTIVE 7 Zeigt das Fenster als minimiertes Fenster an. Ähnlich wie @SW_SHOWMINIMIZED, außer dass das Fenster nicht aktiviert wird.
SW_SHOWNA 8 Zeigt das Fenster in seiner aktuellen Position und Größe. Dieser Wert ist ähnlich wie @SW_SHOW, außer dass das Fenster nicht aktiviert wird.
SW_SHOWNOACTIVATE 4 Zeigt das Fenster in seiner letzten Position und Größe. Entspricht @SW_SHOWNORMAL, außer dass das Fenster nicht aktiviert wird.
SW_SHOWNORMAL 1 Aktiviert und zeigt ein Fenster. Wenn das Fenster minimiert oder maximiert ist, dann stellt das System es in seiner Originalgröße und -position wieder her. Eine Anwendung sollte dieses Flag setzen, wenn ein Fenster zum ersten Mal aufgerufen wird.

Anwendungsbeispiele

Dokument öffnen

   ' Dokument öffnen, z.B. Word-Dokument
   Call ShellExecute(0, "open", "C:\MeinPfad\Mein.doc", "", "", SW_SHOWNORMAL)

Dokument drucken

   ' Dokument drucken:
 
   ' - Das Dokument wird kurz geöffnet und wieder geschlossen, und dann gedruckt. 
   ' - Die Kontante für den Parameter "nshowcmd" spielt keine Rolle.
 
   ' Sonderfälle:
   ' - pdf-Dateien: Der Adobe Reader bleibt geöffnet, das pdf-Dokument wird geschlossen.
   ' - htm-Dateien: - Es kommt immer der Druckerdialog. 
   '                - Ein Druck ist nur möglich beim Internet Explorer als Standardbrowser. 
   '                - Kontante SW_HIDE für Parameter "nshowcmd" nicht brauchbar, stattdessen z.B. SW_SHOW 
 
   ' Fall 1: Excel-Dokument auf dem Standarddrucker drucken 
   Call ShellExecute(0, "print", "C:\MeinPfad\Mein.xls", "", "", SW_HIDE)
 
   ' Fall 2: Excel-Dokument auf einem bestimmten Drucker drucken
   Dim strDruckername As String
 
   strDruckername = Chr(34) & "Microsoft Print to PDF" & Chr(34)
   Call ShellExecute(0, "printto", "C:\MeinPfad\Mein.xls", strDruckername, "", SW_HIDE)

Windows-Explorer öffnen

   ' Windows-Explorer maximiert öffnen
   Call ShellExecute(0, "open", Environ("Windir") & "\explorer.exe", "", "", SW_MAXIMIZE)
 
   ' Windows-Explorer mit einem vorgegebenen Pfad maximiert öffnen:
   Call ShellExecute(0, "open", "C:\MeinPfad\", "", "", SW_MAXIMIZE)
 
   ' Windows-Explorer mit dem Ordner "Eigene Dokumente" maximiert öffnen
   Dim strPfad As String
 
   strPfad = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
 
   ' Fall 1: Ordner "Eigene Dokumente" im Navigationsbereich und im Detailbereich öffnen
   Call ShellExecute(0, "explore", strPfad, "", "", SW_MAXIMIZE)
 
   ' Fall 2: Ordner "Eigene Dokumente" nur im Detailbereich öffnen
   Call ShellExecute(0, "open", strPfad, "", "", SW_MAXIMIZE)

Anwendung in einem bestimmten Verzeichnis ausführen

   ' Anwendung in einem bestimmten Verzeichnis ausführen, Fenster maximieren:
   Call ShellExecute(0, "print", "C:\MeinPfad\Mein.xls", "C:\MeinAndererPfad", "", SW_MAXIMIZE)

Standardbrowser öffnen

   ' Standardbrowser mit Internetseite maximiert öffnen
   Call ShellExecute(0, "open", "http://dbwiki.net/", "", "", SW_MAXIMIZE)

Standard-Mailprogramm öffnen

https://tools.ietf.org/html/rfc2368 The mailto URL scheme

   ' Standard-Mailprogramm öffnen mit Betreff, CC, BCC und Mail-Nachricht
   Dim mailparameter As String
   Const clf As String = "%0A" 'Zeilenumbruch
 
   mailparameter = "mailto:" & "max.mustermann@t-online.de"
   mailparameter = mailparameter & "?Subject=Mein Betreff"
   mailparameter = mailparameter & "&CC=hans.mustermann@t-online.de"
   mailparameter = mailparameter & "&BCC=fritz.mustermann@t-online.de"
   mailparameter = mailparameter & "&Body=Meine Nachricht" & clf & "Zweite Zeile der Nachricht"
 
   'Theoretisch kann über den Parameter "attachment" ein Anhang angefügt werden.
   'Das wird aber nicht von allen Mail-Clients (z.B. Outlook) unterstützt.
   mailparameter = mailparameter & "&attachment=d:\meine_datei.txt"
 
   'Aufruf mit der ShellExecute-Funktion
   Call ShellExecute(0, "open", mailparameter, "", "", SW_SHOWNORMAL)
 
   'Alternativer Aufruf mit der FollowHyperlink-Methode
   Application.FollowHyperlink mailparameter

Windows-Suche öffnen

   ' Windows-Suche für einen bestimmten Ordner öffnen
   Call ShellExecute(0, "find", "C:\Program Files (x86)", "", "", 0)

Rückgabewert der Funktion auswerten

   ' Rückgabewert der Funktion auswerten, z.B. Fehlermeldung, wenn der Pfad nicht existiert
   Dim lngRet As Long
 
   ' Windows-Explorer maximiert öffnen
   lngRet = ShellExecute(0, "o", Environ("Windir") & "\explorer.exe", "", "", SW_MAXIMIZE)
 
   If lngret <= 32 Then
      MsgBox "Es ist ein Fehler aufgetreten."
   End If

Wiki-Links

Web-Links