VBA har några användbara funktioner som kan ta din automatisering i Excel till nästa nivå.
En sådan funktion är VBA DIR -funktion.
Även om det i sig kan verka som en enkel funktion som gör en specifik sak.
Men när du kombinerar det med några andra användbara element i VBA -kodningsspråket kan du skapa kraftfulla saker (täcks av exemplen senare i denna handledning).
Vad gör VBA Dir -funktionen?
Använd VBA DIR -funktionen när du vill få namnet på filen eller en mapp med sökvägens namn.
För att ge dig ett exempel, om du har en Excel -fil i en mapp, kan du använda VBA DIR -funktionen för att få namnet på den Excel -filen (eller någon annan typ av fil).
Vad händer om jag vill få namnen på alla Excel -filer i mappen (eller alla filer - oavsett om det är Excel -fil eller inte)?
Det kan du också!
När du använder DIR -funktionen en gång returnerar den första filnamnet i en mapp. Om du nu vill få namnen på den andra, tredje, fjärde filen också kan du använda DIR -funktionen igen (täcks senare som ett exempel).
Dir returnerar det första filnamnet som matchar söknamnet. För att få ytterligare filnamn som matchar sökvägsnamn, ring Dir igen utan argument. När inga fler filnamn matchar, Dir returnerar en sträng med noll längd (“”). Täcks i exempel 3 och 4 senare i denna handledning.Syntax för VBA DIR -funktion
Dir [(söknamn [, attribut])]
- sökvägsnamn: Detta är ett valfritt argument. Detta kan vara filnamn, mappnamn eller katalognamn. Om sökvägsnamn inte hittas returnerar VBA DIR-funktionen en sträng med noll längd (“”)
- attribut: Detta är ett valfritt argument. Du kan använda detta argument för att ange vissa attribut och DIR -funktionen returnerar filnamnen baserat på dessa attribut. Om du till exempel vill ha en lista över alla dolda filer eller skrivskyddade filer (tillsammans med filer utan attribut) måste du ange det i detta argument.
Tillgängliga attribut att använda i VBA DIR -funktionen (du kan använda en eller flera av dessa):
Konstant | Värde | Beskrivning |
vbNormalt | 0 | (Standard) Anger filer utan attribut. |
vbReadOnly | 1 | Anger skrivskyddade filer utöver filer utan attribut. |
vbHidden | 2 | Anger dolda filer förutom filer utan attribut. |
VbSystem | 4 | Anger systemfiler utöver filer utan attribut. Finns inte på Macintosh. |
vbVolume | 8 | Anger volymetikett; om någon annan tillskrivs specificeras ignoreras vbVolume. Finns inte på Macintosh. |
vbDirectory | 16 | Anger kataloger eller mappar utöver filer utan attribut. |
vbAlias | 64 | Angivet filnamn är ett alias. Finns endast på Macintosh. |
Använda jokertecken med DIR -funktion
Om du arbetar med Windows kan du också använda jokertecken i DIR -funktionen.
Observera att du inte kan använda dessa när du arbetar med VBA i Macintosh.
Att använda jokertecken kan vara användbart när:
- Du vill få filnamnen för en viss filtyp (som .XLSX eller .PPTX)
- När du har ett specifikt suffix/prefix i filnamn och du vill få namnen på dessa filer/mappar/kataloger. Om du till exempel vill ha namnen på alla filer med prefixet2021-2022 i det kan du göra det med jokertecken.
Det finns tre jokertecken i Excel:
- * (asterisk) - Det representerar valfritt antal tecken. Till exempel, 2019* skulle ge dig namnen på alla filer med prefixet2021-2022 i det.
- ? (frågetecken) - Det representerar en enda karaktär. Till exempel 2021-2022? skulle ge dig namnen på alla filer som börjar med2021-2022 och har ytterligare ett tecken i namnet (som2021-2022A, 2021-2022B, 2021-2022C, och så vidare)
Obs! Det finns ytterligare ett jokertecken - tilde (~). Eftersom det inte används mycket har jag hoppat över dess förklaring. Du kan läsa mer om det här om du är intresserad.
VBA DIR -funktion - Exempel
Låt oss nu dyka in och se några exempel på hur du använder VBA DIR -funktionen.
Exempel 1 - Hämta filnamnet från dess sökväg
När du har sökvägen till en fil kan du använda DIR -funktionen för att få namnet på filen från den.
Till exempel returnerar koden nedan namnet på filen och visar den i en meddelanderuta.
Sub GetFileNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \ Excel File A.xlsx") MsgBox FileName End Sub
Ovanstående kod använder en variabel 'Filnamn' för att lagra filnamnet som returneras av DIR -funktionen. Den använder sedan en meddelanderuta för att visa filnamnet (som visas nedan).
Och vad händer när filen inte finns?
I så fall skulle DIR -funktionen returnera en tom sträng.
Koden nedan använder en If Then Else -sats för att kontrollera om filen finns eller inte. Om filen inte finns, visas en meddelanderuta med texten "Filen finns inte", annars visar den filnamnet.
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 Doesn't Exist" End If End Sub
Exempel 2 - Kontrollera om det finns en katalog eller inte (och skapa om den inte gör det)
Koden nedan kontrollerar om mappen "Test" finns eller inte.
En meddelanderuta används för att visa ett meddelande om mappen finns eller om den inte finns.
Sub CheckDirectory () Dim PathName As String Dim CheckDir As String PathName = "C: \ Users \ sumit \ Desktop \ Test" CheckDir = Dir (PathName, vbDirectory) Om CheckDir "" Då MsgBox CheckDir & "finns" Else MsgBox "Katalogen existerar inte "End If End Sub
Du kan förfina denna kod ytterligare för att kontrollera om mappen finns eller inte, och om den inte gör det kan du använda VBA för att skapa den mappen.
Nedan är koden som använder MkDir -funktion att skapa en mapp om den inte finns.
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 contains" Else MkDir PathName MsgBox "En mapp har skapats med namnet" & CheckDir End If End Sub
Exempel 3 - Hämta namnen på alla filer och mappar i en katalog
Om du vill få en lista över alla fil- och mappnamn i en katalog kan du använda DIR -funktionen.
Koden nedan visar alla filer och mappnamn i testmappen (som ligger på följande sökväg - C: \ Users \ sumit \ Desktop \ Test \).
Jag använder Debug.Print för att visa namnen i fönstret Omedelbar. Du kan också använda detta för att lista namnen i en meddelanderuta eller i en kolumn 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 -slingan i ovanstående kod fortsätter tills alla filer och mappar i den angivna sökvägen har täckts. När det inte finns fler filer/mappar att täcka blir FileName en nullsträng och slingan stannar.
Exempel 4 - Hämta namnen på alla filer i en mapp
Du kan använda koden nedan för att få namnen på alla filer i en mapp/katalog (och inte namnen på undermapparna).
Sub GetAllFileNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \") Do While FileName "" Debug.Print FileName FileName = Dir () Loop End Sub
Denna kod är precis som koden som används i exempel 3, med en mindre skillnad.
I den här koden har jag inte specificerat vbDirectory i DIR -funktionen. När du anger vbDirectory kommer det att ge dig namnen på alla filer samt mappar.
När du inte anger vbDirectory ger DIR -funktionen dig bara namnen på filerna.
Notera: Om du vill få namnen på alla filer i huvudmappen och undermapparna kan du inte använda DIR-funktionen (eftersom den inte är rekursiv). För att göra detta kan du antingen använda Power Query (ingen kodning behövs) eller använda filsystemobjektet i VBA (med rekursion).
Exempel 5 - Hämta namnen på alla undermappar i en mapp
Koden nedan ger dig namnen på alla undermappar i den angivna mappen.
Den använder GetAtr -funktion i VBA, vilket gör att vi kan kontrollera om namnet som returneras av DIR -funktionen är namnet på en fil eller en mapp/katalog.
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
Återigen använder jag Debug.Print för att få namnen i det omedelbara fönstret. Du kan få dem i en meddelanderuta eller i Excel (genom att ändra koden i enlighet därmed).
Exempel 6 - Hämta den första Excel -filen från en mapp
Med DIR -funktionen kan du ange filtillägg eller valfritt suffix/prefix i filnamnet som returneras.
Koden nedan visar namnet på den första Excel -filen 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
Observera att jag har använt * .xls * (stjärntecken på båda sidor). Detta säkerställer att alla versioner av Excel -filer kontrolleras (.xls, xlsx, .xlsm, .xlsb).
Exempel 7 - Hämta namn på alla Excel -filer i en mapp
Använd koden nedan för att få namnen på alla Excel -filer i testmappen.
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
Medan DIR -funktionen bara returnerar namnet på den första Excel -filen, eftersom vi kallar den igen i loop, går den igenom alla filer och ger oss namnen på alla Excel -filer.
Hoppas att du fann denna handledning och exemplen användbara.
Låt mig veta dina tankar i kommentarsfältet.