Funkcja VBA DIR - łatwe wyjaśnienie z przykładami

VBA ma kilka przydatnych funkcji, które mogą przenieść automatyzację w programie Excel na wyższy poziom.

Jedną z takich funkcji jest Funkcja VBA DIR.

Chociaż sam w sobie może wydawać się prostą funkcją, która wykonuje jedną konkretną rzecz.

Ale kiedy połączysz go z innymi przydatnymi elementami języka kodowania VBA, możesz stworzyć potężne rzeczy (omówione w przykładach w dalszej części tego samouczka).

Co robi funkcja VBA Dir?

Użyj funkcji VBA DIR, jeśli chcesz uzyskać nazwę pliku lub folderu, używając ich nazwy ścieżki.

Aby podać przykład, jeśli masz plik Excel w folderze, możesz użyć funkcji VBA DIR, aby uzyskać nazwę tego pliku Excel (lub dowolnego innego typu pliku).

Co zrobić, jeśli chcę uzyskać nazwy wszystkich plików Excela w folderze (lub wszystkich plików - czy to plik Excela, czy nie)?

Też możesz to zrobić!

Gdy użyjesz funkcji DIR raz, zwraca ona nazwa pierwszego pliku w folderze. Teraz, jeśli chcesz uzyskać również nazwy drugiego, trzeciego, czwartego pliku, możesz ponownie użyć funkcji DIR (omówionej później jako przykład).

Dir zwraca pierwszą nazwę pliku, która pasuje do nazwy ścieżki. Aby uzyskać dodatkowe nazwy plików pasujące do ścieżki, zadzwoń Dir znowu bez argumentów. Gdy nie ma już zgodnych nazw plików, Dir zwraca ciąg o zerowej długości („”). Omówione w przykładzie 3 i 4 w dalszej części tego samouczka.

Składnia funkcji VBA DIR

Katalog [ (ścieżka [ ,atrybuty ] ) ]
  • nazwa ścieżki: To jest argument opcjonalny. Może to być nazwa pliku, nazwa folderu lub nazwa katalogu. Jeśli ścieżka nie zostanie znaleziona, funkcja VBA DIR zwraca ciąg o zerowej długości („”)
  • atrybuty: To jest argument opcjonalny. Możesz użyć tego argumentu, aby określić niektóre atrybuty, a funkcja DIR zwróci nazwy plików na podstawie tych atrybutów. Na przykład, jeśli chcesz otrzymać listę wszystkich ukrytych plików lub plików tylko do odczytu (wraz z plikami bez atrybutów), musisz to określić w tym argumencie.

Atrybuty dostępne do użycia w funkcji VBA DIR (możesz użyć jednego lub więcej z nich):

Stały Wartość Opis
vbNormal 0 (Domyślnie) Określa pliki bez atrybutów.
vbTylko do odczytu 1 Określa pliki tylko do odczytu oraz pliki bez atrybutów.
vbHidden 2 Określa pliki ukryte oprócz plików bez atrybutów.
VbSystem 4 Określa pliki systemowe oprócz plików bez atrybutów. Niedostępne na komputerach Macintosh.
vbVolume 8 Określa etykietę woluminu; jeśli określono jakikolwiek inny atrybut, vbVolume jest ignorowany. Niedostępne na komputerach Macintosh.
vbDirectory 16 Określa katalogi lub foldery oprócz plików bez atrybutów.
vbAlias 64 Podana nazwa pliku to alias. Dostępne tylko na komputerach Macintosh.

Używanie znaków wieloznacznych z funkcją DIR

Jeśli pracujesz z systemem Windows, możesz również użyć znaków wieloznacznych w funkcji DIR.

Pamiętaj, że nie możesz ich używać podczas pracy z VBA na komputerze Macintosh.

Używanie symboli wieloznacznych może być przydatne, gdy:

  • Chcesz uzyskać nazwy plików określonego typu (na przykład .XLSX lub .PPTX)
  • Kiedy masz określony przyrostek/przedrostek w nazwach plików i chcesz uzyskać nazwy tych plików/folderów/katalogów. Na przykład, jeśli chcesz nazwy wszystkich plików z prefiksem 2021-2022, możesz to zrobić za pomocą symboli wieloznacznych.

W programie Excel są trzy znaki wieloznaczne:

  1. * (gwiazdka) - Reprezentuje dowolną liczbę znaków. Na przykład, 2019* poda nazwy wszystkich plików z prefiksem 2021-2022.
  2. ? (znak zapytania) - Reprezentuje jedną postać. Na przykład 2021-2022? poda nazwy wszystkich plików, które zaczynają się od 2021-2022 i mają w nazwie jeszcze jeden znak (np.2021-2022A,2021-2022B,2021-2022C itd.)

Uwaga: jest jeszcze jeden znak wieloznaczny - tylda (~). Ponieważ nie jest często używany, pominąłem jego wyjaśnienie. Więcej na ten temat możesz przeczytać tutaj, jeśli jesteś zainteresowany.

Funkcja VBA DIR - Przykłady

Teraz zanurkujmy i zobaczmy kilka przykładów użycia funkcji VBA DIR.

Przykład 1 - Pobieranie nazwy pliku z jego ścieżki

Gdy masz ścieżkę do pliku, możesz użyć funkcji DIR, aby uzyskać z niej nazwę pliku.

Na przykład poniższy kod zwraca nazwę pliku i pokazuje go w oknie komunikatu.

Sub GetFileNames() Dim FileName As String FileName = Dir("C:\Users\sumit\Desktop\Test\Excel File A.xlsx") MsgBox FileName End Sub

Powyższy kod używa zmiennej „FileName” do przechowywania nazwy pliku zwracanej przez funkcję DIR. Następnie używa okna komunikatu do wyświetlenia nazwy pliku (jak pokazano poniżej).

A co się dzieje, gdy plik nie istnieje?

W takim przypadku funkcja DIR zwróci pusty ciąg.

Poniższy kod używa instrukcji If Then Else, aby sprawdzić, czy plik istnieje, czy nie. Jeśli plik nie istnieje, wyświetla okno komunikatu z tekstem „Plik nie istnieje”, w przeciwnym razie pokazuje nazwę pliku.

Sub CheckFileExistence() Dim FileName As String FileName = Dir("C:\Users\sumit\Desktop\Test\Excel File A.xlsx") If FileName "" Then MsgBox FileName Else MsgBox "Plik nie istnieje" End If End Pod

Przykład 2 - Sprawdź, czy katalog istnieje, czy nie (i utwórz, jeśli nie)

Poniższy kod sprawdza, czy folder „Test” istnieje, czy nie.

Okno komunikatu służy do wyświetlania wiadomości w przypadku, gdy folder istnieje lub gdy nie istnieje.

Sub CheckDirectory() Dim PathName As String Dim CheckDir As String PathName = "C:\Users\sumit\Desktop\Test" CheckDir = Dir(PathName, vbDirectory) If CheckDir "" Then MsgBox CheckDir & " istnieje" Else MsgBox "Katalog nie istnieje" End If End Sub

Możesz dalej udoskonalić ten kod, aby sprawdzić, czy folder istnieje, czy nie, a jeśli nie, możesz użyć VBA do utworzenia tego folderu.

Poniżej znajduje się kod, który używa Funkcja MkDir utworzyć folder na wypadek, gdyby nie istniał.

Sub CreateDirectory() Dim PathName As String Dim CheckDir As String PathName = "C:\Users\sumit\Desktop\Test" CheckDir = Dir(PathName, vbDirectory) If CheckDir "" Then MsgBox CheckDir & " folder istnieje" Else MkDir PathName MsgBox "Utworzono folder o tej nazwie" & CheckDir End If End Sub

Przykład 3 - Pobierz nazwy wszystkich plików i folderów w katalogu

Jeśli chcesz uzyskać listę wszystkich nazw plików i folderów w katalogu, możesz użyć funkcji DIR.

Poniższy kod zawiera listę wszystkich plików i nazw folderów w folderze Test (znajdującym się w następującej ścieżce - C:\Users\sumit\Desktop\Test\).

Używam Debug.Print, aby wyświetlić nazwy w oknie bezpośrednim. Możesz również użyć tego do wyświetlenia nazw w oknie wiadomości lub w kolumnie w programie Excel.

Sub GetAllFile&FolderNames() Dim FileName As String FileName = Dir("C:\Users\sumit\Desktop\Test\", vbDirectory) Do While FileName "" Debug.Print FileName FileName = Dir() Koniec pętli Sub

Pętla Do While w powyższym kodzie trwa, dopóki wszystkie pliki i foldery w podanej ścieżce nie zostaną pokryte. Gdy nie ma więcej plików/folderów do pokrycia, FileName staje się ciągiem o wartości null, a pętla zatrzymuje się.

Przykład 4 - Pobierz nazwy wszystkich plików w folderze

Możesz użyć poniższego kodu, aby uzyskać nazwy wszystkich plików w folderze/katalogu (a nie nazwy podfolderów).

Sub GetAllFileNames() Dim FileName As String FileName = Dir("C:\Users\sumit\Desktop\Test\") Do While FileName "" Debug.Print FileName FileName = Dir() Koniec pętli Sub

Ten kod jest podobny do kodu użytego w Przykładzie 3, z jedną niewielką różnicą.

W tym kodzie nie określiłem vbDirectory w funkcji DIR. Kiedy określisz vbDirectory, otrzymasz nazwy wszystkich plików oraz folderów.

Jeśli nie określisz vbDirectory, funkcja DIR poda tylko nazwy plików.

Notatka: Jeśli chcesz uzyskać nazwy wszystkich plików w głównym folderze i podfolderach, nie możesz użyć funkcji DIR (ponieważ nie jest ona rekursywna). Aby to zrobić, możesz użyć dodatku Power Query (bez kodowania) lub użyć obiektu systemu plików w języku VBA (z rekurencją).

Przykład 5 - Pobierz nazwy wszystkich podfolderów w folderze

Poniższy kod da ci nazwy wszystkich podfolderów w określonym folderze.

Wykorzystuje Funkcja GetAtr w VBA, co pozwala nam sprawdzić, czy nazwa zwracana przez funkcję DIR jest nazwą pliku czy folderu/katalogu.

Sub GetSubFolderNames() Dim FileName As String Dim PathName As String PathName = "C:\Users\sumit\Desktop\Test\" FileName = Dir(PathName, vbDirectory) Do While FileName "" If GetAttr(PathName & FileName) = vbDirectory Then Debug.Print Nazwa pliku End If Nazwa pliku = Dir() Koniec pętli Sub

Ponownie używam Debug.Print, aby uzyskać nazwy w bezpośrednim oknie. Możesz je otrzymać w oknie wiadomości lub w programie Excel (odpowiednio modyfikując kod).

Przykład 6 - Pobierz pierwszy plik Excela z folderu

Za pomocą funkcji DIR można określić rozszerzenie pliku lub dowolny przyrostek/przedrostek w zwracanej nazwie pliku.

Poniższy kod wyświetli nazwę pierwszego pliku Excel w folderze Test.

Sub GetFirstExcelFileName() Dim FileName As String Dim PathName As String PathName = "C:\Users\sumit\Desktop\Test\" FileName = Dir(PathName & "*.xls*") MsgBox FileName End Sub

Zauważ, że użyłem *.xls* (znak gwiazdki po obu stronach). Zapewni to sprawdzenie wszystkich wersji plików Excela (.xls, xlsx, .xlsm, .xlsb).

Przykład 7 - Pobierz nazwy wszystkich plików Excela w folderze

Użyj poniższego kodu, aby uzyskać nazwy wszystkich plików Excela w folderze Test.

Sub GetAllFileNames() Dim FolderName As String Dim FileName As String FolderName = "C:\Users\sumit\Desktop\Test\" FileName = Dir(FolderName & "*.xls*") Do While FileName "" Debug.Print FileName FileName = Dir() Koniec pętli Sub

Podczas gdy funkcja DIR zwraca tylko nazwę pierwszego pliku Excela, ponieważ wywołujemy go ponownie w pętli, przechodzi przez wszystkie pliki i podaje nam nazwy wszystkich plików Excela.

Mam nadzieję, że ten samouczek i przykłady okazały się przydatne.

Daj mi znać swoje przemyślenia w sekcji komentarzy.

Będziesz pomóc w rozwoju serwisu, dzieląc stronę ze swoimi znajomymi

wave wave wave wave wave