wtorek, 28 stycznia 2014

Okno wyboru folderu

W czasie prowadzonych szkoleń z podstaw VBA dla MS Excel prezentuję jedną z podstawowych technik wyboru folderu z wykorzystaniem wbudowanego okna FileDialogs. Szybko może przypomnę tą technikę w trzech krokach:

1. kod VBA

1Dim A As FileDialog
2On Error Resume Next
3Set A = Application.FileDialog(msoFileDialogFolderPicker)
4A.Show
5Debug.Print A.SelectedItems(1)
6On Error GoTo 0

2. którego efektem dziania jest następujące okno wyświetlane użytkownikowi



3. w efekcie wybrania przez użytkownika określonego folderu zwracany jest wynik w postaci ścieżki do tego folderu:

1C:\Downloads\music

Alternatywne rozwiązanie opiera się  o wykorzystanie zewnętrznej biblioteki Shell.  W wyniku wywołania odpowiednich funkcji wybór folderu odbywa się w oparciu o inne okno, bardziej znane ze środowiska Windows niż samego pakietu Office.


W jaki sposób wygląda kod do tego typu okna. Ponieważ naszym celem jest uzyskanie informacji o wskazanej przez użytkownika ścieżce dlatego też samo rozwiązanie ukrywamy najczęściej w funkcji VBA a nie procedurze. Oto przykładowa funkcja wyświetlająca powyższe okno:
01Function GetFolderPath(Optional OpenAt As Variant) As Variant
02 
03    Dim ShellLib As Object
04    Set ShellLib = CreateObject("Shell.Application"). _
05                BrowseForFolder(0, "Proszę wskazać folder!", 0, OpenAt)
06 
07    On Error Resume Next
08    BrowseForFolder = ShellLib.self.Path
09    On Error GoTo 0
10 
11    Set ShellLib = Nothing
12 
13End Function

Powyższa funkcja nie jest mojego autorstwa lecz uwzględnia moje modyfikacje i uproszczenia. Wiele wariantów tego rozwiązania można odnaleźć w sieci. Stosuję jednak to rozwiązanie o wiele chętniej niż wariant standardowo wbudowany w środowisko VBA prezentowany na początku niniejszego postu.

Pozostała jeszcze kwestia wywołania tej funkcji. W tym celu wystarczy nam poniższy fragment kodu:

1Dim JakiFolder As String
2 
3'opcjonalnie możemy wskazać folder, który _
4 zostanie wskazany przy otwarciu okna
5JakiFolder = GetFolderPath("C:\")
6Debug.Print JakiFolder

Sam wynik, jak łatwo się domyślić, będzie identyczny jak w pierwszym przypadku:

1C:\Downloads\music

Brak komentarzy:

Prześlij komentarz