Sarakstīt failus un mapes rekursīvi, izmantojot Excel VBA


Publikācijas datums:

Atjaunināts:


Tehniskie raksti > Sarakstīt failus un mapes rekursīvi, izmantojot Excel VBA

2026. gada statuss un droša lietošana

Galvenais: apmeklējiet katru mapi, reģistrējiet vajadzīgos failus un katru apakšmapi nododiet tai pašai procedūrai. Pievienojiet skaidru kļūdu apstrādi un noteikumus savienojumpunktiem, simboliskajām saitēm, slēptajām mapēm un ceļiem, kuriem piekļuve ir liegta.

Ko jūs uzzināsiet

  • Kā FileSystemObject atklāj mapes, apakšmapes, failus, nosaukumus un ceļus.
  • Kā rekursija apstaigā visu direktoriju koku un kāpēc dziļiem vai cikliskiem kokiem ir nepieciešami aizsardzības pasākumi.
  • Kā rakstīt rezultātus darblapā, neizmantojot lēnas liela mēroga darbības pa šūnai.

Kam tas paredzēts: Excel lietotājiem, kuri inventarizē kontrolētu Windows direktoriju koku.

2026. gada konteksts: paraugs atspoguļo autora sākotnējo vietējo testu. Apstipriniet atļaujas un saišu darbību jūsu direktoriju struktūras kopijā un apsveriet PowerShell vai speciālu inventarizācijas rīku ļoti lieliem vai drošības ziņā jutīgiem kokiem.

Drošības piezīme. Sākotnējā rakstā esošās komandas un konfigurācijas piemēri nav atkārtoti izpildīti pašreizējā ražošanas vidē. Pirms to lietošanas pārbaudiet atbalstītās versijas, dublējumus, piekļuves vadīklas un atcelšanas darbības atsevišķā testa vidē.

Galvenie oficiālie avoti

Pārskats

Šajā rakstā parādīts, kā ar VBA (Excel makro) rekursīvi iegūt failu un mapju sarakstu, ieskaitot apakšmapes. Piemērs aptver šādus uzdevumus.

  • Iegūt visu mapē esošo failu vai apakšmapju pilno ceļu sarakstu.
  • Ciklā apstrādāt mapē un tās apakšmapēs atrastos failus vai direktorijus.

Satura rādītājs

  1. Risinājuma izveide
  2. Koda skaidrojums
  3. Kopsavilkums

1. Risinājuma izveide

Tālāk dots rekursīvas direktoriju apstaigāšanas piemērs.

Piemērā definēta Function, ko var izsaukt no Sub procedūras. Pirms lietošanas nepazīstamā direktoriju kokā pievienojiet projektam piemērotu kļūdu apstrādi.

'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

Funkcijai jānodod šādi argumenti.

  • filePath — apstaigājamais direktorijs. Piemērs: C:\Users\user\Desktop\test
  • kind — True atgriež failu sarakstu, bet False — mapju sarakstu.
  • list — kolekcija, kurā glabā rezultātus. Tālāk parādīts tās izmantošanas piemērs.

Tālāk parādīts funkcijas izsaukuma piemērs.

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

Pēc getFolderOrFile izsaukuma kolekcijā list atrodas failu vai mapju saraksts. Piemērā nodots False, tāpēc tiek saglabāts mapju saraksts.

For priekšraksta sadaļā "TODO" ierakstiet vajadzīgo apstrādi. Mainīgo ITEM var izmantot kā virkni.

Piemēra kods katru iegūto vērtību ieraksta Excel šūnā A1, tādēļ ciklā viena un tā pati šūna tiek atkārtoti pārrakstīta. Lai saglabātu visu sarakstu, rezultāti jāraksta dažādās rindās vai vienā reizē jānodod šūnu diapazonam.

2. Koda skaidrojums

Pēc lietošanas piemēra aplūkosim rekursijas darbību.

Galvenais ir tas, ka metode getFolderOrFile katrai atrastajai apakšmapei vēlreiz izsauc getFolderOrFile.

Šādi procedūra virzās arvien dziļāk direktoriju kokā un apstrādā visas sasniedzamās mapes.

Nepieejami ceļi, ļoti dziļi koki un cikliskas failu sistēmas saites var pārtraukt vai iesprostot apstrādi, tāpēc ražošanas risinājumā vajadzīga kļūdu apstrāde, dziļuma vai ierakstu limits un skaidra saišu politika.

3. Kopsavilkums

Šis paņēmiens ar VBA rekursīvi uzskaita failus un mapes. Pirms to lietojat nepazīstamā direktoriju kokā, nosakiet, kā rīkoties ar nepieejamiem ceļiem un failu sistēmas saitēm.