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 = 0            'Alternative: vbHide, Fenster versteckt öffnen
Public Const SW_MAXIMIZE = 3        'Alternative: vbMaximizedFocus, Fenster maximiert öffnen
Public Const SW_MINIMIZE = 6        'Alternative: vbMinimizedNoFocus, Fenster minimiert öffnen
Public Const SW_RESTORE = 9
Public Const SW_SHOW = 5
Public Const SW_SHOWDEFAULT = 10
Public Const SW_SHOWMAXIMIZED = 3
Public Const SW_SHOWMINIMIZED = 2   'Alternative: vbMinimizedFocus
Public Const SW_SHOWMINNOACTIVE = 7
Public Const SW_SHOWNA = 8
Public Const SW_SHOWNOACTIVATE = 4  'Alternative: vbNormalNoFocus
Public Const SW_SHOWNORMAL = 1      'Alternative: vbNormalFocus
 
'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

' Standard-Mailprogramm öffnen, Betreff, ggf. CC, ggf. BCC und Mail-Nachricht vorgeben
Dim mailparameter As String
 
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"
 
Call ShellExecute(0, "open", mailparameter, "", "", SW_SHOWNORMAL)

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