VBA har nogle nyttige funktioner, der kan tage din automatisering i Excel til det næste niveau.
En sådan funktion er VBA DIR -funktion.
Selvom det i sig selv kan virke som en simpel funktion, der gør en bestemt ting.
Men når du kombinerer det med nogle andre nyttige elementer i VBA -kodningssproget, kan du oprette kraftfulde ting (dækket i eksemplerne senere i denne vejledning).
Hvad gør VBA Dir -funktionen?
Brug VBA DIR -funktionen, når du vil hente navnet på filen eller en mappe ved hjælp af deres stienavn.
For at give dig et eksempel, hvis du har en Excel -fil i en mappe, kan du bruge VBA DIR -funktionen til at hente navnet på den pågældende Excel -fil (eller enhver anden filtype).
Hvad hvis jeg vil have navnene på alle Excel -filerne i mappen (eller alle filerne - det være sig Excel -fil eller ej)?
Det kan du også!
Når du bruger DIR -funktionen én gang, returnerer den første filnavn i en mappe. Hvis du nu også vil have navnene på den anden, tredje, fjerde fil, kan du bruge DIR -funktionen igen (dækket senere som et eksempel).
Dir returnerer det første filnavn, der matcher stinavnet. For at få yderligere filnavne, der matcher stinavn, skal du ringe Dir igen uden argumenter. Når ikke flere filnavne matcher, Dir returnerer en streng med nul længde (“”). Dækket i eksempel 3 og 4 senere i denne vejledning.Syntaks for VBA DIR -funktion
Dir [(stinavn [, attributter])]
- stinavn: Dette er et valgfrit argument. Dette kan være filnavnet, mappenavnet eller biblioteksnavnet. Hvis stinavn ikke findes, returnerer VBA DIR-funktionen en streng med nul længde (“”)
- egenskaber: Dette er et valgfrit argument. Du kan bruge dette argument til at angive nogle attributter, og DIR -funktionen returnerer filnavnene baseret på disse attributter. Hvis du f.eks. Vil have en liste over alle skjulte filer eller skrivebeskyttede filer (sammen med filer uden attributter), skal du angive det i dette argument.
Tilgængelige attributter i VBA DIR -funktionen (du kan bruge en eller flere af disse):
Konstant | Værdi | Beskrivelse |
vbNormal | 0 | (Standard) Angiver filer uden attributter. |
vbReadOnly | 1 | Angiver skrivebeskyttede filer ud over filer uden attributter. |
vbSkjult | 2 | Angiver skjulte filer ud over filer uden attributter. |
VbSystem | 4 | Angiver systemfiler ud over filer uden attributter. Ikke tilgængelig på Macintosh. |
vbVolume | 8 | Angiver volumenetiket; hvis der er angivet en anden attribut, ignoreres vbVolume. Ikke tilgængelig på Macintosh. |
vbDirectory | 16 | Angiver mapper eller mapper ud over filer uden attributter. |
vbAlias | 64 | Det angivne filnavn er et alias. Fås kun på Macintosh. |
Brug af jokertegn med DIR -funktion
Hvis du arbejder med Windows, kan du også bruge jokertegnene i DIR -funktionen.
Bemærk, at du ikke kan bruge disse, når du arbejder med VBA i Macintosh.
Brug af jokertegn kan være nyttig, når:
- Du vil have filnavne for en bestemt filtype (f.eks. .XLSX eller .PPTX)
- Når du har et specifikt suffiks/præfiks i filnavne, og du vil have navnene på disse filer/mapper/mapper. For eksempel, hvis du vil have navnene på alle filerne med præfikset2021-2022 i det, kan du gøre det ved hjælp af jokertegn.
Der er tre jokertegn i Excel:
- * (stjerne) - Det repræsenterer et vilkårligt antal tegn. For eksempel, 2019* ville give dig navnene på alle filerne med præfikset2021-2022 i den.
- ? (spørgsmålstegn) - Det repræsenterer en enkelt karakter. For eksempel 2021-2022? ville give dig navnene på alle de filer, der starter med2021-2022 og har et tegn mere i navnet (f.eks. 2021-2022A, 2021-2022B, 2021-2022C og så videre)
Bemærk: Der er endnu et jokertegn - tilde (~). Da det ikke er brugt meget, har jeg sprunget over forklaringen. Du kan læse mere om det her, hvis du er interesseret.
VBA DIR -funktion - eksempler
Lad os nu dykke ned og se nogle eksempler på brug af VBA DIR -funktionen.
Eksempel 1 - Hent filnavnet fra dets sti
Når du har stien til en fil, kan du bruge DIR -funktionen til at hente filens navn fra den.
For eksempel returnerer nedenstående kode navnet på filen og viser den i en meddelelsesboks.
Sub GetFileNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \ Excel File A.xlsx") MsgBox FileName End Sub
Ovenstående kode bruger en variabel ‘Filnavn’ til at gemme det filnavn, der returneres af DIR -funktionen. Det bruger derefter en meddelelsesboks til at vise filnavnet (som vist nedenfor).
Og hvad sker der, når filen ikke findes?
I så fald returnerer DIR -funktionen en tom streng.
Nedenstående kode bruger en If Then Else -sætning til at kontrollere, om filen findes eller ej. Hvis filen ikke findes, viser den en meddelelsesboks med teksten "Filen findes ikke", ellers viser den filnavnet.
Sub CheckFileExistence () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \ Excel File A.xlsx") If FileName "" Then MsgBox FileName Else MsgBox "File Does not Exist" End If End Sub
Eksempel 2 - Kontroller, om der findes en telefonbog eller ej (og opret, hvis den ikke gør det)
Nedenstående kode kontrollerer, om mappen ‘Test’ findes eller ej.
En meddelelsesboks bruges til at vise en meddelelse, hvis mappen findes, eller når den ikke findes.
Sub CheckDirectory () Dim PathName As String Dim CheckDir As String PathName = "C: \ Users \ sumit \ Desktop \ Test" CheckDir = Dir (PathName, vbDirectory) Hvis CheckDir "" Så er MsgBox CheckDir & "findes" Ellers MsgBox "Mappen findes ikke "End If End Sub
Du kan forfine denne kode yderligere for at kontrollere, om mappen findes eller ej, og hvis den ikke gør det, kan du bruge VBA til at oprette den mappe.
Nedenfor er koden, der bruger MkDir -funktion at oprette en mappe, hvis den ikke findes.
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 exist" Else MkDir PathName MsgBox "Der er oprettet en mappe med navnet" & CheckDir End If End Sub
Eksempel 3 - Få navnene på alle filer og mapper i et bibliotek
Hvis du vil have en liste over alle fil- og mappenavne i et bibliotek, kan du bruge DIR -funktionen.
Nedenstående kode viser alle filer og mappenavne i Test -mappen (som er placeret på følgende sti - C: \ Users \ sumit \ Desktop \ Test \).
Jeg bruger Debug.Print til at vise navnene i vinduet Umiddelbart. Du kan også bruge dette til at angive navnene i en meddelelsesboks eller i en kolonne i Excel.
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
Do While -løkken i ovenstående kode fortsætter, indtil alle filer og mapper i den givne sti er dækket. Når der ikke er flere filer/mapper, der skal dækkes, bliver FileName en null -streng, og sløjfen stopper.
Eksempel 4 - Hent navnene på alle filer i en mappe
Du kan bruge nedenstående kode til at hente navnene på alle filerne i en mappe/bibliotek (og ikke navnene på undermapperne).
Sub GetAllFileNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \") Do While FileName "" Debug.Print FileName FileName = Dir () Loop End Sub
Denne kode er ligesom koden brugt i eksempel 3, med en mindre forskel.
I denne kode har jeg ikke angivet vbDirectory i DIR -funktionen. Når du angiver vbDirectory, giver det dig navnene på alle filerne samt mapper.
Når du ikke angiver vbDirectory, giver DIR -funktionen dig kun navnene på filerne.
Bemærk: Hvis du vil have navnene på alle filerne i hovedmappen og undermapperne, kan du ikke bruge DIR-funktionen (da den ikke er rekursiv). For at gøre dette kan du enten bruge Power Query (ingen kodning nødvendig) eller bruge filsystemobjektet i VBA (med rekursion).
Eksempel 5 - Få navnene på alle undermapper i en mappe
Nedenstående kode vil give dig navnene på alle undermapperne i den angivne mappe.
Den bruger GetAtr -funktion i VBA, som giver os mulighed for at kontrollere, om navnet, der returneres af DIR -funktionen, er navnet på en fil eller en mappe/bibliotek.
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 FileName End If FileName = Dir () Loop End Sub
Igen bruger jeg Debug.Print til at få navnene i det umiddelbare vindue. Du kan få disse i en meddelelsesboks eller i Excel (ved at ændre koden i overensstemmelse hermed).
Eksempel 6 - Hent den første Excel -fil fra en mappe
Med DIR -funktionen kan du angive filtypen eller ethvert suffiks/præfiks, du vil have i det filnavn, der returneres.
Nedenstående kode viser navnet på den første Excel -fil i testmappen.
Sub GetFirstExcelFileName () Dim FileName As String Dim PathName As String PathName = "C: \ Users \ sumit \ Desktop \ Test \" FileName = Dir (PathName & "*.xls*") MsgBox FileName End Sub
Bemærk, at jeg har brugt * .xls * (stjerne tegn på begge sider). Dette sikrer, at alle versioner af Excel -filer kontrolleres (.xls, xlsx, .xlsm, .xlsb).
Eksempel 7 - Hent navne på alle Excel -filer i en mappe
Brug nedenstående kode til at få navnene på alle Excel -filerne i Test -mappen.
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 () Loop End Sub
Mens DIR -funktionen kun returnerer navnet på den første Excel -fil, da vi kalder den igen i loop, går den igennem alle filerne og giver os navnene på alle Excel -filerne.
Håber du fandt denne vejledning og eksemplerne nyttige.
Lad mig vide dine tanker i kommentarfeltet.