Es gibt eine ganze Reihe von Verzeichnissen, die es auf jedem Rechner gibt. Manche davon sollten eigentlich immer gleich lauten, aber durch die Installation von Windows oder Software auf Laufwerken mit anderen Laufwerkbuchstaben als C: gibt es hier gelegentlich Unterschiede. In manchen Fällen sorgt auch die Betriebssystemversion für Unterschiede, beispielsweise bei 32bit- gegenüber 64bit-Systemen. Und ganz sicher unterscheiden sich die Verzeichnisse, die dem jeweiligen Benutzer gehören. Dennoch wollen Sie früher oder später einmal dynamisch auf ein bestimmtes Verzeichnis zugreifen wie etwa das Verzeichnis der eigenen Dateien eines Benutzers oder das Add-In-Verzeichnis von Access. Dieser Beitrag zeigt, wie Sie solche Verzeichnisse ermitteln.
Verzeichnisse, Dateinamen und Pfade
Vorab eine kleine Begriffsklärung: Wir sprechen nachfolgend von Verzeichnis, wenn es sich um einen Ort handelt, an dem man Dateien speichern kann:
c:\Verzeichnis
Ein Dateiname ist der reine Dateiname ohne Verzeichnis:
Beispieldatenbank.mdb
Der Pfad fasst Verzeichnis und Dateiname zusammen, wobei beide noch durch das Backslash-Zeichen voneinander getrennt werden:
c:\Verzeichnis\Beispieldatenbank.mdb
Verzeichnis der aktuellen Datenbankdatei
Die aktuelle Datenbank wollen Sie zum Beispiel ermitteln, wenn Sie auf Dateien zugreifen wollen, die Sie im Kontext der aktuellen Datenbankanwendung direkt im gleichen oder in einem untergeordneten Verzeichnis der Datenbank gespeichert haben. Früher, als es noch kein CurrentProject-Objekt gab, hat man das Verzeichnis einer Datenbank über den Umweg der Eigenschaft Name des Objekts CurrentDb ermittelt. CurrentDb.Name lieferte den kompletten Pfad, also beispielsweise den folgenden Ausdruck:
c:\Verzeichnis\Beispieldatenbank.mdb
Den Dateinamen konnte man mithilfe der Funktion Dir ermitteln, die lediglich den Namen einer Datei bei Angabe des kompletten Pfades zurücklieferte:
Dir("c:\Verzeichnis\Beispieldatenbank.mdb") Beispieldatenbank.mdb
Davon ausgehend, dass der Dateiname nicht als Teil eines der Verzeichnisse verwendet wurde, die den Speicherort der Datei festlegten, ließ sich so durch geschickten Einsatz von Zeichenkettenfunktionen auch das Verzeichnis extrahieren:
Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Dir(CurrentDb.Name)))
Dies ermittelte im letzten Teil zunächst die Länge des Dateinamens. Dann wird die Länge des Verzeichnisses ohne Dateiname ermittelt. Das Ergebnis dient als zweiter Parameter der Left-Funktion, die nur die dadurch angegebene Anzahl Zeichen des im ersten Parameter übergebenen Ausdrucks zurückgibt.
Ab Access 2000 änderte sich dies zum Glück: Das CurrentProject-Objekt wurde eingeführt und lieferte einige Eigenschaften, mit denen sich Dateiname, Verzeichnis und Pfad separat ermitteln ließen – nämlich Name, Path und FullName:
CurrentProject.Name StandardverzeichnissePerVBA.accdb CurrentProject.Path C:\...\StandardverzeichnissePerVBA CurrentProject.FullName C:\...\StandardverzeichnissePerVBA\ StandardverzeichnissePerVBA.accdb
Verzeichnis der Datei MSAccess.exe
Das Verzeichnis der ausführbaren Datei MSAccess.exe, mit der die aktuell geöffnete Datenbankdatei gestartet wurde, finden Sie mit dem folgenden Ausdruck – hier etwa für die 32bit-Version unter Office 15:
SysCmd(acSysCmdAccessDir) C:\Program Files (x86)\Microsoft Office\Office15\
Verzeichnis einer Add-In-Datenbank
Wenn Sie ein Add-In nutzen und innerhalb des Add-Ins auf die aktuell geöffnete Datenbank zugreifen möchten, gelingt dies mit den weiter oben vorgestellten Eigenschaften CurrentDb.Name beziehungsweise CurrentProject.Path, CurrentProject.Name und CurrentProject.FullName. Aber was, wenn Sie auf die Add-In-Datenbank zugreifen wollen – beispielsweise, um ihren Datenbankpfad zu ermitteln und in diesem Verzeichnis Dateien zu speichern
Dann nutzen Sie statt der Objekte CurrentDb und CurrentProject einfach analog CodeDb und CodeProject. Wenn Sie die Add-In-Datenbank direkt unter Access öffnen (und nicht über das Add-In-Menü), sind die Objekte CurrentDb und CodeDb beziehungsweise CurrentProject und CodeProject identisch.
Weitere Verzeichnisse per API ermitteln
Die API-Funktion SHGetKnownFolderPath ermöglicht es, eine ganze Reihe von Verzeichnissen zu ermitteln. Dabei übergeben Sie dieser lediglich verschiedene Werte, die dem jeweiligen Verzeichnis entsprechen. Die API-Funktion deklarieren Sie wie folgt in einem Standardmodul:
Private Declare Function SHGetKnownFolderPath Lib "shell32" (rfid As Any, ByVal dwFlags As Long, ByVal hToken As Long, ppszPath As Long) As Long
Wir benötigen aber noch weitere API-Deklarationen:
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszGuid As Long, pGuid As Any) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long) Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal hMem As Long) Private Declare Function lstrlenW Lib "kernel32" (ByVal ptr As Long) As Long
Außerdem verwendet die nachfolgend beschriebene Funktion ein Type-Element namens GUID zum Speichern der einzelnen Elemente einer GUID:
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