Jak pobrać listę plików z danego folderu

przez | 2024-06-04

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.