Rekurzivni seznam datotek in map z VBA v Excelu


Datum objave:

Posodobljeno:


Tehnični članki > Rekurzivni seznam datotek in map z VBA v Excelu

Stanje in varna uporaba v letu 2026

Sklep: Funkcija rekurzivno obišče vsako mapo, želene poti doda v zbirko in za vsako podmapo znova pokliče isti postopek. Za produkcijsko uporabo dodajte obravnavo napak ter jasna pravila za povezave imenikov (junctions), simbolične povezave, skrite mape in poti brez dovoljenja za dostop.

Kaj boste izvedeli

  • Kako FileSystemObject omogoča dostop do map, podmap, datotek in njihovih poti.
  • Kako rekurzivni postopek prehodi celotno drevo in zakaj globoka ali ciklična drevesa potrebujejo varovala.
  • Kako rezultate zbrati pred zapisom na delovni list in se izogniti počasnemu pisanju po posameznih celicah.

Komu je članek namenjen? Uporabnikom Excela, ki pripravljajo popis nadzorovanega drevesa map v sistemu Windows.

Opomba za leto 2026: Primer izhaja iz lokalnega preizkusa. Na kopiji svoje strukture preverite dovoljenja in vedenje povezav. Za zelo velika ali varnostno občutljiva drevesa uporabite PowerShell ali namensko orodje za popis.

Varnostna opomba: Ukazi in konfiguracijski primeri iz prvotnega članka niso bili znova preizkušeni v sodobnem produkcijskem okolju. Pred uporabo v ločenem preizkusnem okolju preverite podprte različice, izdelajte varnostne kopije ter določite nadzor dostopa in postopek povrnitve.

Uradni viri

Pregled

Primer prikazuje, kako z VBA v Excelu pridobiti seznam datotek ali map iz celotnega drevesa podmap. Uporaben je za naslednji nalogi:

  • Pridobivanje polnih poti vseh datotek ali map pod izbrano začetno mapo.
  • Zaporedna obdelava najdenih datotek ali map v zanki.

Kazalo vsebine

  1. Primer funkcije
  2. Potek kode
  3. Povzetek

1. Primer funkcije

Spodnja funkcija je referenčni primer rekurzivnega prehoda map.

Funkcijo getFolderOrFile pokličete iz postopka Sub ter ji posredujete začetno pot, vrsto želenega rezultata in zbirko za shranjevanje poti.

'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

Funkcija sprejme naslednje argumente:

  • filePath: pot začetne mape, na primer C:\Users\user\Desktop\test.
  • kind: vrednost True v zbirko doda poti datotek, False pa poti map.
  • list: zbirka Collection, v katero funkcija dodaja najdene polne poti.

Spodaj je primer klica funkcije.

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

Klic getFolderOrFile shrani poti datotek ali map v zbirko list. Ker primer posreduje False, zbirka vsebuje poti map.

Želeno obdelavo dodajte na mesto "TODO" v zanki For Each. Spremenljivka item vsebuje posamezno pot.

Prikazani primer vsako vrednost zapiše v celico A1 in jo zato vedno znova prepiše. Za dejanski seznam uporabite zaporedne vrstice ali zbrane rezultate na delovni list zapišite v enem koraku.

2. Potek kode

Ključni del je rekurzivni klic funkcije getFolderOrFile znotraj iste funkcije.

Funkcija najprej doda datoteke ali trenutno mapo v zbirko. Nato s FileSystemObject pridobi vse neposredne podmape in za vsako znova pokliče getFolderOrFile.

Postopek se konča, ko trenutna mapa nima več podmap. V okolju s povezavami ali zelo globokimi drevesi dodajte zaznavanje že obiskanih poti, omejitev globine in obravnavo napak dostopa.

Pri velikem številu zadetkov upoštevajte tudi porabo pomnilnika zbirke in rezultate zapisujte v paketih.

3. Povzetek

Rekurzivni klic omogoča, da funkcija VBA zbere polne poti datotek ali map iz celotnega drevesa podmap. Pred uporabo v večjem okolju določite ravnanje z dovoljenji, povezavami, cikli in globino drevesa ter učinkovit način zapisa rezultatov.

Pri uporabi v novejšem okolju upoštevajte tudi opombe o različicah in varnosti na začetku članka.