VBA ima neke korisne funkcije koje mogu podići vašu automatizaciju u Excelu na višu razinu.
Jedna od takvih funkcija je VBA DIR funkcija.
Iako se samo po sebi može činiti kao jednostavna funkcija koja radi jednu određenu stvar.
No, kada ga kombinirate s nekim drugim korisnim elementima jezika kodiranja VBA, možete stvoriti moćne stvari (opisane u primjerima kasnije u ovom vodiču).
Što radi VBA Dir funkcija?
Koristite funkciju VBA DIR kada želite dobiti naziv datoteke ili mape, koristeći njihov naziv putanje.
Na primjer, ako imate Excel datoteku u mapi, pomoću funkcije VBA DIR možete dobiti naziv te Excel datoteke (ili bilo koje druge vrste datoteke).
Što ako želim dobiti imena svih Excel datoteka u mapi (ili svih datoteka - bila to Excel datoteka ili ne)?
Možete i to učiniti!
Kada jednom upotrijebite funkciju DIR, ona vraća datoteku ime prve datoteke u mapi. Sada, ako želite dobiti i nazive druge, treće, četvrte datoteke, možete ponovno koristiti funkciju DIR (kasnije će biti obrađeno kao primjer).
Upu vraća prvo ime datoteke koje odgovara imenu putanje. Da biste dobili dodatne nazive datoteka koji odgovaraju imenu putanje, nazovite Upu opet bez argumenata. Kad se više ne podudaraju nazivi datoteka, Upu vraća niz nulte duljine (""). Opisano u primjerima 3 i 4 kasnije u ovom vodiču.Sintaksa VBA DIR funkcije
Dir [(ime puta [, atributi])]
- ime putanje: Ovo je izborni argument. To može biti naziv datoteke, naziv mape ili naziv direktorija. Ako ime putanje nije pronađeno, funkcija VBA DIR vraća niz nulte duljine ("")
- atribute: Ovo je izborni argument. Ovaj argument možete koristiti za navođenje nekih atributa, a funkcija DIR vratit će nazive datoteka na temelju tih atributa. Na primjer, ako želite popis svih skrivenih datoteka ili datoteka samo za čitanje (zajedno s datotekama bez atributa), morate to navesti u ovom argumentu.
Atributi dostupni za korištenje u VBA DIR funkciji (možete koristiti jedan ili više od ovih):
Konstantno | Vrijednost | Opis |
vbNormalno | 0 | (Zadano) Određuje datoteke bez atributa. |
vbReadOnly | 1 | Određuje datoteke samo za čitanje uz datoteke bez atributa. |
vbHidden | 2 | Određuje skrivene datoteke osim datoteka bez atributa. |
VbSystem | 4 | Određuje datoteke sustava uz datoteke bez atributa. Nije dostupno na Macintosh -u. |
vbVolume | 8 | Određuje oznaku volumena; ako je naveden bilo koji drugi atribut, vbVolume se zanemaruje. Nije dostupno na Macintosh -u. |
vbDirectory | 16 | Određuje direktorije ili mape uz datoteke bez atributa. |
vbAlias | 64 | Navedeni naziv datoteke je pseudonim. Dostupno samo na Macintosh -u. |
Korištenje zamjenskih znakova s DIR funkcijom
Ako radite sa sustavom Windows, u funkciji DIR možete koristiti i zamjenske znakove.
Imajte na umu da ih ne možete koristiti pri radu s VBA -om u Macintosh -u.
Korištenje zamjenskih znakova može biti korisno u sljedećim slučajevima:
- Želite dobiti nazive datoteka određene vrste datoteke (poput .XLSX ili .PPTX)
- Kad u imenima datoteka imate određeni sufiks/prefiks i želite dobiti nazive tih datoteka/mapa/direktorija. Na primjer, ako želite imena svih datoteka s prefiksom2021-2022, to možete učiniti pomoću zamjenskih znakova.
U Excelu postoje tri zamjenska znaka:
- * (zvjezdica) - Predstavlja neograničeni broj znakova. Na primjer, 2019* dao bi vam imena svih datoteka s prefiksom2021-2022.
- ? (upitnik) - Predstavlja jedan jedini znak. Na primjer, 2021.-2022.? dao bi vam nazive svih datoteka koje počinju s 2021-2022 i imaju još jedan znak u imenu (kao što su 2021-2022A, 2021-2022B, 2021-2022C itd.)
Napomena: Postoji još jedan zamjenski znak - tilda (~). Budući da se ne koristi puno, preskočio sam njegovo objašnjenje. Ovdje možete pročitati više o tome ako ste zainteresirani.
VBA DIR funkcija - primjeri
Ajmo sada zaroniti i vidjeti neke primjere korištenja VBA DIR funkcije.
Primjer 1 - Dobivanje naziva datoteke s putanje
Kad imate put do datoteke, pomoću funkcije DIR možete dobiti naziv datoteke iz nje.
Na primjer, donji kod vraća naziv datoteke i prikazuje ga u okviru za poruku.
Sub GetFileNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \ Excel File A.xlsx") MsgBoxNaziv datoteke Kraj pod
Gornji kôd koristi varijablu "FileName" za spremanje naziva datoteke koji vraća funkcija DIR. Zatim koristi okvir s porukom za prikaz naziva datoteke (kao što je prikazano u nastavku).
A što se događa kada datoteka ne postoji?
U tom bi slučaju funkcija DIR vratila prazan niz.
Donji kod koristi naredbu If Then Else za provjeru postoji li datoteka ili ne. Ako datoteka ne postoji, prikazuje okvir s porukom s tekstom "Datoteka ne postoji", inače prikazuje naziv datoteke.
Sub CheckFileExistence () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \ Excel File A.xlsx") If FileName "" Tada MsgBoxNaziv datoteke Ostalo MsgBox "Datoteka ne postoji" Završi ako završi Pod
Primjer 2 - Provjerite postoji li direktorij ili ne (i stvorite ako ne postoji)
Kod u nastavku provjerava postoji li mapa "Test" ili ne.
Okvir s porukom koristi se za prikaz poruke u slučaju da mapa postoji ili kada ne postoji.
Pod CheckDirectory () Dim PathName As String Dim CheckDir As String PathName = "C: \ Users \ sumit \ Desktop \ Test" CheckDir = Dir (PathName, vbDirectory) If CheckDir "" Onda MsgBox CheckDir & "postoji" Ostalo MsgBox "Direktorij ne postoji "End If End Sub
Ovaj kôd možete dodatno poboljšati kako biste provjerili postoji li mapa ili ne, a ako ne postoji, tada možete upotrijebiti VBA za stvaranje te mape.
Ispod je kôd koji koristi MkDir funkcija za stvaranje mape u slučaju da ne postoji.
Sub CreateDirectory () Dim PathName As String Dim CheckDir As String PathName = "C: \ Users \ sumit \ Desktop \ Test" CheckDir = Dir (PathName, vbDirectory) If CheckDir "" Tada MsgBox CheckDir & "mapa postoji" Ostalo MkDir Ime putanje "Mapa je stvorena s imenom" & CheckDir End If End Sub
Primjer 3 - Dobijte nazive svih datoteka i mapa u direktoriju
Ako želite dobiti popis svih naziva datoteka i mapa u direktoriju, možete koristiti funkciju DIR.
U donjem kodu navedene su sve datoteke i nazivi mapa u testnoj mapi (koja se nalazi na sljedećoj stazi - C: \ Users \ sumit \ Desktop \ Test \).
Koristim Debug.Print za prikaz imena u prozoru Odmah. To možete upotrijebiti i za popis imena u okviru za poruku ili u stupcu u Excelu.
Sub GetAllFile & FolderNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \", vbDirectory) Do While FileName "" Debug.Print FileName FileName = Dir () Loop End Sub
Petlja Do While u gornjem kodu nastavlja se sve dok se ne pokriju sve datoteke i mape na navedenoj putanji. Kad nema više datoteka/mapa za pokrivanje, FileName postaje nulti niz i petlja se zaustavlja.
Primjer 4 - Dobijte nazive svih datoteka u mapi
Pomoću donjeg koda možete dobiti imena svih datoteka u mapi/direktoriju (a ne imena podmapa).
Sub GetAllFileNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \") Do While FileName "" Debug.Print FileName FileName = Dir () Loop End Sub
Ovaj kôd je poput koda korištenog u primjeru 3, s jednom manjom razlikom.
U ovom kodu nisam naveo vbDirectory u funkciji DIR. Kada navedete vbDirectory, on će vam dati imena svih datoteka, kao i mapa.
Ako ne navedete vbDirectory, funkcija DIR dat će vam samo nazive datoteka.
Bilješka: Ako želite dobiti imena svih datoteka u glavnoj mapi i podmapama, ne možete koristiti funkciju DIR (jer nije rekurzivna). Da biste to učinili, možete upotrijebiti Power Query (nije potrebno kodiranje) ili koristiti objekt datotečnog sustava u VBA (s rekurzijom).
Primjer 5 - Dobijte imena svih podmapa unutar mape
Donji kôd će vam dati imena svih podmapa unutar navedene mape.
Koristi se GetAtr funkcija u VBA -i, što nam omogućuje da provjerimo je li naziv vraćen funkcijom DIR naziv datoteke ili mape/direktorija.
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 & FileNactory) = vb Debug.Print FileName End Ako je FileName = Dir () Završi petlju Pod
Opet, koristim Debug.Print za dobivanje imena u neposrednom prozoru. Možete ih dobiti u okviru za poruku ili u Excelu (odgovarajućom izmjenom koda).
Primjer 6 - Nabavite prvu Excel datoteku iz mape
Pomoću funkcije DIR možete odrediti nastavak datoteke ili bilo koji sufiks/prefiks u imenu datoteke koji se vraća.
U donjem kodu prikazao bi se naziv prve Excel datoteke u mapi Test.
Sub GetFirstExcelFileName () Dim FileName As String Dim PathName As String PathName = "C: \ Users \ sumit \ Desktop \ Test \" FileName = Dir (PathName & "*.xls*") MsgBox Ime datoteke Kraj Sub
Imajte na umu da sam koristio * .xls * (znak zvjezdice s obje strane). To će osigurati provjeru svih verzija Excel datoteka (.xls, xlsx, .xlsm, .xlsb).
Primjer 7 - Dobijte imena svih Excel datoteka u mapu
Upotrijebite donji kod da biste dobili imena svih Excel datoteka u mapi Test.
Sub GetAllFileNames () Zatamnjivanje Naziv mape Kao niz Zatamnjenje Ime datoteke kao niz Naziv mape = "C: \ Users \ sumit \ Desktop \ Test \" FileName = Dir (FolderName & "*.xls*") Do While FileName "" Debug.Print FileName FileName = Dir () Kraj petlje Sub
Dok funkcija DIR vraća samo naziv prve Excel datoteke, budući da je ponovno pozivamo u petlji, ona prolazi kroz sve datoteke i daje nam imena svih Excel datoteka.
Nadam se da vam je ovaj vodič i primjeri bili korisni.
Recite mi svoja razmišljanja u odjeljku za komentare.