Jedną z najczęściej wykonywanych czynności w makrach jest zaczytywanie danych z innych plików. Obojętnie czy robi się to formułami, kwerendą WEB czy Power Query – w każdym wypadku musimy znać pełną lokalizację pliku, z którego chcemy pobrać dane.
Pobranie Lokalizacji
Istnieją generalnie dwa podejścia do tematu. Albo korzystamy ze stałych przechowujących pełne ścieżki do plików, albo wyświetlamy okienko dialogowe z prośbą o wybór właściwego pliku na dysku.
Pierwsze podejście stosuje się w sytuacjach, gdy nasza aplikacja jest rozbudowana i operuje na wielu skoroszytach. W takim przypadku nikt rozsądny nie będzie wyświetlał okienka dialogowego z prośbą o zaznaczenie właściwego pliku, ponieważ byłoby to zbyt uciążliwe.
Trzeba jednak pamiętać, że jest to rozwiązanie mniej elastyczne, bo wymaga, aby pliki znajdowały się w konkretnych lokalizacjach. Z drugiej strony – łatwo wprowadzić w kodzie zmiany, jeśli lokalizacja się zmieni. Takie stałe najlepiej trzymać w osobnym module.
Okienko Dialogowe
Drugie podejście jest bardziej elastyczne, ale przerywa makro – wymaga pewnej interakcji z użytkownikiem.
Są jednak sytuacje gdzie spisze się ono lepiej od zakodowanej stałej. Chodzi tu głównie o przypadki gdy lokalizacja pliku jest zmienna.
W jaki sposób sczytać pełną lokalizację pliku Excela? Najlepiej korzystając ze świetnego obiektu FileDialog, który daje o wiele większe możliwości od wbudowanej metody GetOpenFilename obiektu Application. Przykład funkcji poniżej.
Kod Funkcji
Public Function sSciezkaDoPliku(ByVal sTytul As String, _
ByVal sPrzycisk As String) As String
'// Funkcja wyświetla okienko dialogowe i zwraca pełną ścieżkę do pliku
Dim sOkienko As String ' Pełna ścieżka do pliku lub pusty ciąg
1 With Application.FileDialog(msoFileDialogFilePicker)
'Wyczyść wszystkie filtry i dodaj nowy na pliki excelowe
2 With .Filters
3 .Clear
4 .Add "Skoroszyt programu Excel z obsługą makr", "*.xlsm", 1
5 .Add "Skoroszyt programu Excel", "*.xlsx", 2
6 .Add "Skoroszyt programu Excel 97-2003", "*.xls", 3
7 End With
8 .Title = sTytul ' Tytuł okienka
9 .ButtonName = sPrzycisk ' Etykieta na przycisku
10 .InitialFileName = ThisWorkbook.Path ' Wyświetl domyślnie katalog z plikiem
11 .AllowMultiSelect = False ' Pozwól na wybranie tylko jednego pliku
12 .Show ' Wyświetl
'Sprawdź czy użytkownik wybrał plik Jeżeli tak, to pobierz do zmiennej jego pełną ścieżkę
'Gdy nie dokonał wyboru, wtedy przypisz do zmiennej pusty ciąg.
13 If .SelectedItems.Count = 0 Then
14 sOkienko = ""
15 Else
16 sOkienko = .SelectedItems(1)
17 End If
'Przypisz do wyniku wartość zmiennej
18 sSciezkaDoPliku = sOkienko
19 End With
End Function