Explorer und Shell ansteuern

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

Listing 3: Prozeduren zum erweiterten Starten des Explorers

Die Routine OpenFileExplorer ist allgemeiner gehalten. Als Parameter übergeben Sie ihr in sFile den Pfad einer Datei oder eines Orders. Dieser wird dann im Explorer geöffnet und markiert, indem die /Select-Option mit der String-Variablen verkettet wird.

Nun finden Sie im Explorer ja nicht nur Elemente des Dateisystems, wie das noch bis Windows 98 der Fall war, sondern auch solche, wie Systemsteuerung oder Netzwerke. Diese Elemente besitzen keinen Verzeichnispfad.

Und dennoch kann man sie ansteuern: Dazu bedarf es anstelle des Pfads einer speziellen GUID, die das Element eindeutig identifiziert. Die Routine RunExplorerSys etwa öffnet die Systemsteuerung, weil diese grundsätzlich die angegebene GUID besitzt.

Die Schreibweise ist dabei immer gleich: vor die eigentliche GUID kommen zwei Doppelpunkte. Diese Shell-Objekte sind unter dem Namen SpecialFolders bekannt, wobei jene mit einer GUID eigentlich SpecialSpecialFolders heißen müssten, wie wir noch sehen werden.

Da diese Elemente wiederum im Prinzip Ordner darstellen können, ist auch der Bezug auf deren Unterelemente möglich. Die Systemsteuerung enthält etwa die Liste der Drucker.

Auf sie beziehen Sie sich, indem Sie an die GUID eine weitere, wie einen Unterordner durch den BackSlash getrennt, anfügen. So kommen Sie in RunExplorerPrinters direkt in die Verzeichnisliste der Drucker des Systems.

Sie fragen sich vielleicht, wo die GUIDs herkommen Das ist leider nicht so einfach zu beantworten. Zwar gibt es generell gültige Shell-Elemente mit vorgegebener GUID, wie etwa bei der Systemsteuerung, doch durch installierbare Shell-Erweiterungen sieht die Sache auf jedem System anders aus. Zum Glück können Sie über die Shell32-Bibliothek diese GUIDs für ihr System selbst ermitteln…

Shell-NameSpaces

Bisher verwendeten wir nur die eine Methode ShellExecute des Shell-Objekts. Eine mächtige Funktion ist daneben NameSpace, die uns zu neuen Klassen der Bibliothek führt.

NameSpace übergibt man einen Parameter des Typs Variant. Dabei kann es sich um einen String oder eine Zahl handeln. Zurück bekommt man dann ein Objekt der Klasse Folder.

Die Methode ist also dafür gemacht, um virtuelle Ordner-Objekte anhand von Parametern zurückzugeben. Ein einfaches Beispiel:

Dim fld As Shell32.Folder
Set fld = oShell.NameSpace("c:\")

Hier bekommen wir ein virtuelles Objekt mit Bezug auf den physischen Ordner c:. Virtuell deshalb, weil ein Folder-Objekt nicht nur ein Element des Dateisystems darstellen kann, sondern abstrakt zum Beispiel auch die Drucker der Systemsteuerung.

Das Folder-Objekt hat verschiedene Eigenschaften, von der die Title-Eigenschaft vielleicht die wichtigste ist:

Set fld = oShell.NameSpace("c:\")
Debug.Print fld.Title
> "(C:) Windows 7"

Leider gibt Title die Bezeichnung des Folders zurück, nicht den Pfadnamen allein. Deshalb ist ein kleiner Umstand nötig. Die Eigenschaft Self des Folder-Objekts stellt ein neues Objekt der Klasse FolderItem dar, welche wiederum die Eigenschaft Path kennt. Den Pfad eines Folders ermittelt man demnach so:

Set fld = oShell.NameSpace("c:\")
Debug.Print fld.Self.Path
> "c:\"

Statt des Strings zur Pfadangabe kann – Sie werden es sich denken können – auch eine SpecialFolder-GUID als Parameter übergeben werden:

Dim sGUID As String
sGUID = "::{21EC2020-3AEA-1069-A2DD-08002B30309D}"
Set fld = oShell.NameSpace(sGUID)
Debug.Print fld.Title
> "Systemsteuerung"
Debug.Print fld.Self.Path
> "::{21EC2020-3AEA-1069-A2DD-08002B30309D}"

Und schließlich wurde erwähnt, dass auch eine Zahl als Parameter für NameSpace dienen kann. Testen Sie das:

Set fld = oShell.NameSpace (0)
Debug.Print fld.Title
> "Desktop"
Debug.Print fld.Self.Path
> "C:\Users\Minhorst\Desktop"

Die 0 entspricht also dem Desktop-Ordner Ihres Windows-Kontos. Die Zahlen, die hier übergeben werden können, sind im Bereich von 0 bis 255. Es handelt sich um IDs von Windows-Spezialverzeichnissen, eben der Special Folders. Dies gibt uns die Möglichkeit, alle Spezialordner von Windows in einer Schleife zu enumerieren:

For i = 0 To 255
     Set fld = oShell.NameSpace(i)
     Debug.Print i, fld.Title
     Debug.Print i, fld.Self.Path
Next i

Heraus kommt dabei ungefähr das:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar