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
  2. Så fungerar koden
  3. Sammanfattning

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.