Loopen doorheen mappen en bestanden

Inleiding

Na een aantal maanden stilte is er hier nog eens een nieuw artikel op mijn website. Het bevat code om lussen te maken doorheen alle bestanden en submappen van een gegeven map. Vaak vraagt men op forums om gegevens te kopiëren uit alle Excel files in een bepaalde map en onderliggende mappen. Hiervoor heb je een lus nodig zoals we in dit artikel gaan uiteen zetten.

Lussen doorheen bepaalde mappen

Op MrExcel was er echter een uitgebreidere vraag: hier. De vraagsteller wil loopen doorheen alle files in mappen 3 niveau‘s dieper dan een gegeven submap. Mits wat geavanceerdere programmatie is dit zeer goed mogelijk in Excel VBA. Dit was mijn voorbeeldsetup voor de case op MrExcel:

Voorbeeldcode

Op de C-schijf heb ik de map MrExcel met daaronder nog een hele hoop andere mappen en Excel files. We gaan nu nu doorheen die mappen loopen.

' Wim Gielis ' http://www.wimgielis.com
''''' ' Module to loop through files and (sub)folders ' also code to search files in folders x levels deep ' 12/06/11 '''''
Const sRootFolder As String = "C:\MrExcel\"
Sub test()
Call MAINroutine(sRootFolder)
End Sub
Private Sub MAINroutine(sSourceFolder As String)
Set fldr = CreateObject("scripting.filesystemobject").Getfolder(sSourceFolder) For Each fl In fldr.Files Call DoOneFile(fl.Path) Next For Each SubFolder In fldr.SubFolders MAINroutine SubFolder.Path Next
End Sub
Private Sub DoOneFile(sFullFileName As String)
If LevelsDeep(sRootFolder, sFullFileName) = 3 Then Debug.Print sFullFileName End If
End Sub
Function LevelsDeep(sHigherFolder As String, sLowerFolder As String) As Integer
If InStr(1, sLowerFolder, sHigherFolder, 1) = 1 Then LevelsDeep = UBound(Split(Right(sLowerFolder, Len(sLowerFolder) - Len(sHigherFolder)), "\")) Else LevelsDeep = 0 End If
End Function

Uitleg

De flow van de code in deze module is als volgt.

  1. Voer de procedure test uit.
  2. Daarbij zal dan de MAINroutine uitgevoerd worden voor de map die we bovenaan in de module aangeven.
  3. Vervolgens voeren we diezelfde procedure nog x aantal keer uit, telkens voor de submappen van de map.
  4. Voor elke map of bestand zal dan de procedure DoOneFile uitgevoerd worden met als parameter het volledige pad van de map of bestand.
  5. Die laatste procedure zal in het Immediate Window ( Control + G) een lijn wegschrijven wanneer een bestand zich bevindt in een map 3 mappen dieper dan de map waarmee we startten. Het getal 3 kan je uiteraard gemakkelijk aanpassen.

Wil je niet (alleen) de naam van de map wegschrijven als output, maar bijvoorbeeld de bijhorende file testen en behandelen, dan zal je de procedure DoOneFile moeten aanpassen c.q. uitbreiden. Bijvoorbeeld, je test of het om een Excel file gaat. Indien ja, dan open je de file in code en kopieert bepaalde waarden naar een centraal bestand.

Happy programming! :-)




Over Wim

Wim Gielis is Business Intelligence consultant en Excel expert

Andere links