Lista filer och mappar rekursivt med Excel VBA
Publicerad:
Uppdaterad:
Tekniska artiklar > Lista filer och mappar rekursivt med Excel VBA
Status 2026 och säker användning
Slutsats: Gå igenom ett katalogträd rekursivt: samla filerna i varje katalog och anropa samma procedur för varje underkatalog. Lägg till tydlig felhantering och regler för katalogkopplingar, symboliska länkar, dolda kataloger och nekad åtkomst.
Det här går artikeln igenom
- Hur FileSystemObject exponerar kataloger, underkataloger, filer, namn och sökvägar.
- Hur rekursion bygger en fullständig lista och varför djupa eller cykliska katalogträd kräver skydd.
- Hur resultat kan skrivas till ett kalkylblad utan långsamma operationer en cell i taget i stora listor.
Målgrupp: Excel-användare som inventerar ett avgränsat Windows-katalogträd.
Läge 2026: Exemplet bygger på författarens ursprungliga lokala test. Kontrollera behörigheter och länkbeteende på en kopia av katalogstrukturen. För mycket stora eller säkerhetskänsliga katalogträd passar PowerShell eller ett särskilt inventeringsverktyg ofta bättre.
Säkerhetsinformation: Kod- och konfigurationsexemplen i originalartikeln har inte testats på nytt i en aktuell produktionsmiljö. Kontrollera versioner med support, säkerhetskopior, åtkomstkontroller och återställningssteg i en separat testmiljö innan de används.
Viktiga officiella källor
Översikt
Artikeln visar hur VBA i Excel kan lista filer eller kataloger i ett helt katalogträd. Exemplet passar följande uppgifter:
- samla fullständiga sökvägar till alla filer eller kataloger under en rotkatalog;
- bearbeta varje hittad fil eller katalog i en loop.
Innehållsförteckning
1. Arbetsmetod
Följande funktion samlar antingen filer eller kataloger i en Collection och anropar sig själv för varje underkatalog.
Funktionen anropas från en Sub-rutin med rotkatalog, val av objekttyp och den Collection som ska ta emot resultatet.
'Parameter Examples
'## filePath C:\Users\user\Desktop\test\
'## kind false:folder, true:file
'## list
Function getFolderOrFile(filePath As String, kind As Boolean, list As Collection) As Collection
'delete\
Dim filePathEnd As String
filePathEnd = Right(filePath, 1)
If filePathEnd = "\" Then
filePath = Left(filePath, Len(filePath) - 1)
End If
'Folder existence check
Dim result As String
result = Dir(filePath, vbDirectory)
If result = "" Then
MsgBox "File does not exist!"
Exit Function
End If
If kind Then
Dim buf As String
buf = Dir(filePath & "\*.*")
Do While buf <> ""
list.Add filePath & "\" & buf
buf = Dir()
Loop
Else
list.Add filePath
End If
Dim folder As Object
With CreateObject("Scripting.FileSystemObject")
For Each folder In .GetFolder(filePath).SubFolders
getFolderOrFile folder.Path, kind, list
Next folder
End With
End Function
Skicka följande argument till funktionen:
- filePath: rotkatalogen, exempelvis C:\Users\user\Desktop\test.
- kind: True samlar filer och False samlar kataloger.
- list: den Collection där de fullständiga sökvägarna ska lagras.
Följande Sub-rutin visar hur funktionen anropas och hur resultatet kan itereras.
Sub test()
Dim list As Collection
Set list = New Collection
getFolderOrFile "C:\Users\user\Desktop\test", False, list
Dim item As Variant
For Each item In list
'------TODO------
ThisWorkbook.Worksheets(1).Cells(1, 1).Value = item
Next
End Sub
När getFolderOrFile har körts innehåller list resultatet. Exemplet skickar False och samlar därför kataloger.
Ersätt "TODO" i For Each-loopen med den behandling som ska utföras för varje sökväg. Variabeln item innehåller den aktuella posten.
Exempelraden skriver varje post till cell A1 och skriver därför över föregående värde. Använd ett stigande radnummer eller skriv en array till ett sammanhängande cellområde för att behålla hela listan.
2. Så fungerar koden
Funktionen tar bort ett avslutande omvänt snedstreck, kontrollerar att rotkatalogen finns och samlar sedan filer eller den aktuella katalogen beroende på argumentet kind.
Den centrala delen är att getFolderOrFile anropar sig själv för varje objekt i SubFolders.
Varje rekursivt anrop behandlar en underkatalog och upprepar samma kontroll för dess underkataloger.
Rekursionen fortsätter tills en katalog saknar underkataloger. I verklig drift behövs felhantering för nekad åtkomst samt skydd mot cykler via katalogkopplingar eller symboliska länkar.
3. Sammanfattning
FileSystemObject och en rekursiv funktion kan samla fullständiga sökvägar till filer eller kataloger i ett helt katalogträd.
Avgränsa rotkatalogen, hantera åtkomstfel och länkar uttryckligen och skriv resultatet till kalkylbladet i block när listan är stor.