Jedną z rzeczy, które mnie denerwują w VBA to jest brak 100% pokrycia metod i właściwości w obiekcie Application. Przykładowo jeśli chciałbym się dowiedzieć w jakim folderze jest zainstalowany Word, Excel lub PowerPoint to mógłbym użyć instrukcji:
MsgBox Application.Path
I to wszystko. Niestety, ale ani w programie Access ani w Outlook obiekt Application nie posiada właściwości Path. A czasami chcemy z jakiegoś powodu wiedzieć w jakim folderze mamy zainstalowany dany program. Na szczęście znalazłem ciekawy trik.
Oto prosta funkcja dla Outlooka:
Function Application_Path()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
On Error Resume Next
Application_Path = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\OUTLOOK.EXE\Path")
On Error GoTo 0
End Function
A oto wersja dla programu Access:
Function Application_Path()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
On Error Resume Next
Application_Path = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE\Path")
On Error GoTo 0
End Function
Jak widzisz różnica jest jedynie taka, że odczytujemy zawartość innego klucza z rejestru. O co tutaj chodzi? Otóż w kluczu:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
Niektóre programy zapisują tworzą klucz o nazwie NAZWA_PLIKU.EXE (np. OUTLOOK.EXE, MSACCESS.EXE itp.) W tym kluczu znajduje się wartość ciągu o nazwie Path, która zawiera nazwę folderu w którym ten plik się znajduje. Jest to przydatne dla systemu operacyjnego oraz innych aplikacji, które mogą potrzebować uruchomić dany program lub uzyskać dostęp do jego pliku wykonywalnego.
Wskazówka: wielkość liter nie ma znaczenia, więc czy napiszesz w funkcji msaccess.exe czy MSACCESS.EXE to i tak uzyskasz ścieżkę do danego pliku (o ile istnieje taki wpis w rejestrze)
Uwaga: jeśli w rejestrze nie ma danego klucza (nie każda aplikacja zapisuje „swoje namiary”) w tym kluczu w rejestrze, albo popełnisz literówkę w nazwie pliku (np. ja w pierwszej wersji wpisałem odruchowo access.exe a nie msaccess.exe) to funkcja Application_Path zwróci pusty ciąg znaków!