Czasami chcemy pobrać listę wszystkich plików z danego folderu. Np. chcemy po kolei otworzyć każdy plik, dokonać w nim zmiany, zapisać i zamknąć. Aby coś takiego zrobić należy w jakiś sposób pobrać listę plików z danego folderu. Możemy tutaj skorzystać z funkcji Dir. Oto prosty przykład:
Sub ListaPlikow(ByVal Folder As String)
Dim Plik As String
If Right$(Folder, 1) <> "\" Then Folder = Folder + "\"
Plik = Dir(Folder & "*.*")
Do While Plik <> ""
Debug.Print Plik
Plik = Dir()
Loop
End Sub
Sub ListujPliki()
Call ListaPlikow("c:\pliki\")
End Sub
Nasza procedura ListujPliki wywołuje procedurę ListaPlikow, która jako parametr przyjmuje ścieżkę do folderu.
Na początku upewniamy się czy ostatni znak w ścieżce pliku (zmienna Folder) to \ jeśli nie to go dodajemy do zmiennej Folder. Jeśli użytkownik podałby ścieżkę do folderu bez znaku \ na końcu to nasza funkcja Dir nie zadziała.
Następnie funkcja Dir pobiera nazwę pierwszego pliku z Folderu do zmiennej Plik. Jeśli folder byłby pusty to zmienna Plik będzie pusta i nie wykona się pętla Do While.
Jeśli w folderze jest choć jeden plik to zmienna Plik będzie zawierała nazwę jakiegoś pliku i kod pomiędzy Do While a Loop się wykona (a instrukcja Debug.Print wyświetli zawartość zmiennej Plik czyli naszą nazwę pliku (bez ścieżki)). Ostatnia komenda w tej pętli to funkcja Dir() która pobiera nazwę kolejnego pliku. Pętla ta będzie działała do momentu kiedy zmienna Plik nie będzie pusta (jeśli funkcja Dir pobierze nazwę ostatniego pliku z folderu to kolejne jej wywołanie zwróci pustą wartość i kolejny przebieg pętli Do While się nie wykona.
Uwaga: jeśli podany folder nie istnieje to funkcja Dir nie zwraca żadnego błędu. Po prostu nie pobierze ona nazwy żadnego pliku a nasza pętla się nie wykona. Dlatego dobrze by było przed wytwołaniem funkcji ListaPlików sprawdzić, czy folder o podanej nazwie istnieje.
W taki oto prosty sposób możemy wypisać nazwy wszystkich plików w wybranym folderze (bez podfolderów).
Jeśli chciałbyś coś z plikiem zrobić to zamiast Debug.Print możesz wywołać jakąś pomocniczą funkcję, która wykonuje operacje na danym pliku. Wtedy nasz kod mógłby wyglądać następująco:
Sub ObrabiajPlik(Plik As String)
MsgBox "Obrabiam plik: " + Plik, vbInformation
'tutaj jakieś dalsze operacje
End Sub
Sub ListaPlikow(ByVal Folder As String)
Dim Plik As String
If Right$(Folder, 1) <> "\" Then Folder = Folder + "\"
Plik = Dir(Folder & "*.*")
Do While Plik <> ""
ObrabiajPlik Folder + Plik
Plik = Dir()
Loop
End Sub
Sub ListujPliki()
Call ListaPlikow("c:\pliki\")
End Sub
No dobra, a co jeśli chcielibyśmy obrabiać tylko pliki z wybranym rozszerzeniem? Np. xls i xlsx? Tutaj np. w pętli Do While możemy dodać dodatkowy warunek sprawdzający rozszerzenie pliku (sprawdzamy czy 4 ostatnie znaki w nazwie pliku to .xls lub 5 ostatnich znaków w nazwie pliku to .xlsx). Wtedy nasza procedura by wyglądała następująco:
Sub ListaPlikow(ByVal Folder As String)
Dim Plik As String
Dim plikXLS As String
If Right$(Folder, 1) <> "\" Then Folder = Folder + "\"
Plik = Dir(Folder & "*.*")
Do While Plik <> ""
If Right$(Plik, 4) = ".xls" Or Right$(Plik, 5) = ".xlsx" Then
Debug.Print Plik
End If
Plik = Dir()
Loop
End Sub
Jak widać kod do wypisania listy wszystkich plików z danego folderu nie jest zbyt skomplikowany. Kod ten ma pewną wadę – nie uwzględnia podfolderów. Ale jest to temat na osobny wpis, gdyż na ten moment nie chcę komplikować kodu.