Rekursinis failų ir aplankų sąrašas su Excel VBA
Paskelbimo data:
Atnaujinta:
Techniniai straipsniai > Rekursinis failų ir aplankų sąrašas su Excel VBA
2026 m. būsena ir saugus naudojimas
Išvada: su FileSystemObject peržiūrėkite kiekvieno katalogo failus, o kiekvienam poaplankiui rekursyviai iškvieskite tą pačią procedūrą. Numatyti reikia klaidų tvarkymą ir aiškią jungčių, simbolinių nuorodų, paslėptų katalogų bei neprieinamų kelių politiką.
Ką išmoksite
- Kaip „FileSystemObject“ atskleidžia aplankus, poaplankius, failus, pavadinimus ir kelius.
- Kaip rekursija apeina visą katalogų medį ir kodėl giliems ar cikliniams medžiams reikia apsaugų.
- Kaip didelį rezultatų rinkinį įrašyti į darbalapį neatliekant lėtų operacijų po vieną langelį.
Kam tai skirta: „Excel“ naudotojams, kurie inventorizuoja valdomą „Windows“ katalogų medį.
2026 m. kontekstas: pavyzdys sukurtas autoriaus vietinei bandymo aplinkai. Teises ir nuorodų elgseną tikrinkite katalogų medžio kopijoje. Labai dideliems ar saugumo požiūriu jautriems katalogams geriau tinka PowerShell arba specialus inventorizavimo įrankis.
Saugos pastaba: pradiniame straipsnyje pateiktos komandos ir konfigūracijos pavyzdžiai nebuvo pakartotinai vykdomi dabartinėje gamybos aplinkoje. Prieš taikydami, patikrinkite palaikomas versijas, atsargines kopijas, prieigos valdiklius ir atšaukimo veiksmus atskiroje bandymo aplinkoje.
Pagrindiniai oficialūs šaltiniai
Apžvalga
Šiame straipsnyje parodyta, kaip su VBA makrokomanda surinkti failų arba katalogų sąrašą iš viso katalogų medžio. Pavyzdys tinka šioms užduotims:
- gauti visų failų arba katalogų pilnų kelių sąrašą, įskaitant poaplankius;
- cikle apdoroti katalogų medyje rastus failus arba katalogus.
1. Programavimo metodas
Toliau pateikiamas funkcijos pavyzdys.
Funkcija kviečiama iš Sub procedūros. Prieš naudodami ją savo aplinkoje, perskaitykite kodą ir numatykite neprieinamų arba ciklinių kelių tvarkymą.
'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 perduodami šie argumentai:
- filePath: pradinis katalogas, pavyzdžiui, C:\Users\user\Desktop\test.
- kind: True grąžina failų, o False – katalogų sąrašą.
- list: Collection objektas rezultatams kaupti.
Toliau pateikiamas faktinio funkcijos iškvietimo įgyvendinimo pavyzdys.
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
Iškvietus getFolderOrFile, rezultatai įrašomi į perduotą kolekciją. Pavyzdyje naudojama False, todėl surenkami katalogai.
Norimą veiksmą įrašykite For ciklo vietoje „TODO“. Kintamąjį ITEM galima traktuoti kaip String.
Pavyzdinis priskyrimas langeliui A1 tik parodo gautą reikšmę ir kiekvienoje iteracijoje tą patį langelį perrašo. Visam sąrašui išvesti naudokite skirtingas eilutes arba masyvą.
2. Kodo paaiškinimas
Svarbiausia vieta yra rekursyvus getFolderOrFile iškvietimas.
Procedūra peržiūri esamo katalogo turinį, o radusi poaplankį iškviečia save su to poaplankio keliu.
Taip apeinamas visas medis. Praktiniame kode reikia saugotis ciklų, per gilaus rekursijos lygio ir katalogų, kuriems trūksta prieigos teisių.
3. Santrauka
Rekursyvi VBA funkcija gali surinkti failų arba katalogų sąrašą iš viso valdomo katalogų medžio. Prieš taikydami dideliame ar nepatikimame medyje, pridėkite klaidų, ciklų ir prieigos teisių tvarkymą.
Techniniai straipsniai
Peržiūrėkite visus techninius straipsnius.
Profilis
Peržiūrėkite autoriaus profilį.
Kontaktai