Hin und wieder kommt es vor, dass Sie aus Access heraus den Windows Explorer öffnen und dabei gleich ein Verzeichnis Ihrer Wahl ansteuern möchten. Gründe dafür gibt es viele. Haben Sie etwa eine Textdatei exportiert, so macht es sich gut, dem Anwender anschließend gleich den passenden Ordner zu präsentieren und dort die Datei zu markieren. über einige Zeilen VBA-Code rund um ein Shell-Objekt ist das schnell realisiert.
Explorer aufrufen
Der Explorer ist eine Anwendung, die die Verwaltung der Windows Shell oder zumindest Teile von ihr, erlaubt. Wir erwähnen diesen Zusammenhang nur, weil später noch ausführlicher auf Shell-Objekte unter VBA eingegangen wird.
Um ausführbare Dateien zu starten, können Sie die VBA-Anweisung Shell verwenden. Sie übergeben ihr als Parameter den Pfad zur ausführbaren Datei und optional noch den Fenstermodus, in dem sie gestartet werden soll:
Shell "Explorer.exe", vbNormalFocus
Diese Zeile öffnet den Windows Explorer in einem normalen Fenster. Sie können dieses jedoch auch gleich maximieren:
Shell "Explorer.exe", vbMaximizedFocus
Den Pfad zur explorer.exe müssen Sie nicht voll ausschreiben oder kennen, da sie sich im Suchpfad von Windows befindet. War””s das schon Nein, natürlich nicht! Denn erstens gibt es noch diverse Kommandozeilenoptionen für den Explorer, die zu erläutern wären, und zweitens stellen wir noch eine Alternative zur Shell-Anweisung vor.
ShellExecute
Vielleicht ist Ihnen diese Funktion schon einmal untergekommen. Es gibt zwar eine Windows-API-Funktion gleichen Namens, doch wir verwenden sie im Zusammenhang mit der Shell-Bibliothek, wo sie ebenfalls vorkommt und auch identische Funktionalität aufweist.
Dazu benötigen wir einen Verweis auf diese Bibliothek. öffnen Sie im VBA-Editor unter Extras|Verweise den entsprechenden Dialog und aktivieren Sie den Eintrag Microsoft Shell Controls And Automation. Diese Bibliothek ist grundsätzlich unter jeder Version von Windows vorhanden und verweist auf die shell32.dll. Nun können Sie ein Shell-Objekt anlegen:
Dim oShell As Shell32.Shell Set oShell = New Shell32.Shell
Wenn Sie im VBA-Objektkatalog oben die Bibliothek Shell32 auswählen und links zur Shell-Klasse navigieren, so finden Sie rechts deren zahlreiche Methoden, und deren Namen sagen bereits einiges über das Thema der Klasse aus.
Uns interessiert im Moment nur die Methode ShellExecute, die ähnlich arbeitet, wie die Shell-Anweisung von VBA, jedoch mit deutlich mehr Parametern ausgestattet ist, die die Funktionalität erweitern. Mit dieser Zeile öffnen Sie den Explorer, nachdem das Shell-Objekt angelegt wurde:
oShell.ShellExecute "explorer.exe", _ , , , "open", 1
Mehrere Parameter der Methode sind optional, was durch die Kommas deutlich wird. Zunächst erwartet die Funktion den Pfad der ausführbaren Datei, wobei dieser auch hier nicht vollständig angegeben werden muss.
Der zweite Parameter gibt die Kommandozeilenoptionen an, die der Anwendung mitgegeben werden sollen. Soll der Explorer das Verzeichnis c:\windows anzeigen, so ist hier der richtige Ort für die Pfadangabe:
oShell.ShellExecute _ "explorer.exe", "c:\windows"
Damit weicht die Syntax dieser Funktion von der Shell-Anweisung ab, bei der beide Angaben in einem String zu kombinieren wären:
Shell "explorer.exe c:\windows"
Das macht die Sache etwas übersichtlicher. Der dritte optionale Parameter gibt den Ausführungspfad an. Wie bei Dateiverknüpfungen können Sie hier festlegen, welches Standardverzeichnis dem startenden Prozess zugeeignet wird. In der Regel kann dieser Parameter ignoriert werden.
Das Interessante an der ShellExecute-Funktion ist nun der vierte Parameter, der das sogenannte Aktions-Verb erwartet. Das sind Strings, die die auf den Prozess auszuführende Aktion angeben. Der Standard ist open für normales Starten der Anwendung. Lassen Sie den Parameter aus, so setzt Windows funktional automatisch open ein. Es gibt aber natürlich noch weitere Verben, auf die später noch die Sprache kommt.
Der letzte Parameter ist identisch mit dem der Shell-Anweisung und gibt den Fenstermodus an. Die 1 im Beispiel entspricht dem vbNormalFocus. Sie können hier also die gleichen Konstanten angeben, wie bei der Shell-Anweisung.
Damit Sie nicht in jeder Routine, die das Shell-Objekt benötigt, dieses per New neu anlegen müssen, greifen Sie zu einer Hilfsfunktion, wie in Listing 1. Dort ist in einem Modul die Variable m_Shell als globales Shell-Objekt deklariert.
Public m_Shell As Shell32.Shell Public Function oShell() As Shell32.Shell If m_Shell Is Nothing Then Set m_Shell = New Shell32.Shell Set oShell = m_Shell End Function
Listing 1: Funktion zum Zurückgeben des Shell-Objekts
Die Funktion oShell gibt dieses Objekt schlicht zurück, überprüft davor jedoch mit einem Test auf Nothing, ob es überhaupt gefüllt ist. Falls nicht, so wird der Variablen ein neues Shell-Objekt verabreicht. oShell können Sie nun an jeder beliebigen Stelle im VBA-Projekt verwenden, wenn Sie ein Shell-Objekt benötigen.
Kommandozeilenoptionen
Anhand der folgenden Prozeduren erläutern wir, wie sich der aufgerufene Explorer über Kommandozeilenoptionen steuern lässt (s. Listing 2).
Sub RunExplorerFolder() oShell.ShellExecute "explorer.exe", "c:\windows", , "open", 1 End Sub Sub RunExplorerList() oShell.ShellExecute "explorer.exe", "/e,c:\", , "open", 1 End Sub Sub RunExplorerRoot() oShell.ShellExecute "explorer.exe", "/e,/root,c:\windows", , "open", 1 End Sub Sub RunExplorerSelectFolder() oShell.ShellExecute "explorer.exe", _ "/select,c:\windows\system32", , "open", 1 End Sub Sub RunExplorerSelectFile() oShell.ShellExecute "explorer.exe", _ "/select,c:\windows\system32\mscomctl.ocx", , "open", 1 End Sub
Listing 2: Verschiedene Routinen mit Optionen zum Starten des Explorers
Die erste Option lernten Sie bereits kennen. Sie öffnet den Explorer mit vorgegebenem Pfad (Prozedur RunExplorerFolder). In RunExplorerList ist dem Pfad c:\windows noch ein /e, vorangestellt.
Das soll nach Aussage von Microsoft den Explorer im Modus mit Verzeichnisbaum links und Dateien rechts öffnen. Ohne dieses /e würde sich nur der Ordner allein öffnen. Diese Aussage ist für neuere Windows-Versionen nicht mehr gültig. Die geteilte Ansicht tritt in beiden Fällen ein.
Wie daraus aber zu erkennen ist, werden mehrere Optionen durch Kommas getrennt aneinander gefügt. Gibt man als weitere Option /root an, so wird der folgende Pfad als Startverzeichnis des Explorers angewählt (Prozedur RunExplorerRoot). Alle anderen Elemente sind ausgeblendet. Sie können in diesem Explorer also nicht auf darüber liegende Verzeichnisse oder Laufwerke wechseln.
Die entsprechenden Schaltflächen fehlen auch im Menüband.
Schließlich lässt sich über die Option /Select auch direkt ein Verzeichnis oder eine Datei im sich öffnenden Explorer markieren.
Dazu fügen Sie deren Pfad unmittelbar hinter die Anweisung an (Prozeduren RunExplorerSelectFile und RunExplorerSelectFolder).
Leider lässt sich diese Option nicht mit /root kombinieren.
Das bedeutet: Wenn Sie Verzeichnisse oder Dateien vormarkieren, so bleibt links leider der ganze Baum bestehen.
Der Versuch, beide Optionen dennoch zu kombinieren, führt ohne Fehlermeldung schlicht zur Anzeige des Desktops im Explorer.
Möchten Sie den Explorer mit der Auswahl Computer starten, so greifen Sie wie in Prozedur RunExplorerComputer aus Listing 3 zu einem Trick: übergeben Sie einfach nur ein Komma als Options-String.
Sub RunExplorerComputer() oShell.ShellExecute "explorer.exe", ",", , "open", 1 End Sub Sub OpenFileExplorer(sFile As String) oShell.ShellExecute "explorer.exe", "/select," & sFile, , "open", 1 End Sub Sub RunExplorerSys() oShell.ShellExecute "explorer.exe", _ "::{21EC2020-3AEA-1069-A2DD-08002B30309D}", , "open", 1 End Sub Sub RunExplorerPrinters() oShell.ShellExecute "explorer.exe", "/e,/root, " & _ "::{21ec2020-3aea-1069-a2dd-08002b30309d}\" & _ "::{2227a280-3aea-1069-a2de-08002b30309d}", , "open", 1 End Sub