Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loop Through All Subfolders Using VBA [duplicate]

I'm looking for a VBA script that will loop through all subfolders of a specified folder. When I say all subfolders, I mean each folder inside the specified folder, and each folder inside of that, and each folder inside of that...in theory there could be infinite nested subfolders, but in actuality it will probably not go above 3 or 4. I'm using the VBA Scripting Runtime objects, so that once I loop into the folder I can check properties of some files (but I know how to do that part).

Thank you for your help!

This question is different from the listed "similar" questions in the previous questions contained known directories, whereas the need here was to find known and unknown directories. Also needed multiple layers of subdirectories. You guys really should just read the question before you fire off "duplicate".

like image 560
Jake Avatar asked Mar 25 '14 20:03

Jake


People also ask

What is Vbdirectory VBA?

VBA DIR function is also known as the directory function, this is an inbuilt function in VBA which is used to give us the file name of a given file or a folder but we need to provide the path for the file, the output returned by this function is string as it returns the name of the file, there are two arguments to this ...


2 Answers

Just a simple folder drill down.

sub sample()     Dim FileSystem As Object     Dim HostFolder As String      HostFolder = "C:\"      Set FileSystem = CreateObject("Scripting.FileSystemObject")     DoFolder FileSystem.GetFolder(HostFolder) end  sub  Sub DoFolder(Folder)     Dim SubFolder     For Each SubFolder In Folder.SubFolders         DoFolder SubFolder     Next     Dim File     For Each File In Folder.Files         ' Operate on each file     Next End Sub 
like image 76
Rich Avatar answered Sep 18 '22 21:09

Rich


And to complement Rich's recursive answer, a non-recursive method.

Public Sub NonRecursiveMethod()     Dim fso, oFolder, oSubfolder, oFile, queue As Collection      Set fso = CreateObject("Scripting.FileSystemObject")     Set queue = New Collection     queue.Add fso.GetFolder("your folder path variable") 'obviously replace      Do While queue.Count > 0         Set oFolder = queue(1)         queue.Remove 1 'dequeue         '...insert any folder processing code here...         For Each oSubfolder In oFolder.SubFolders             queue.Add oSubfolder 'enqueue         Next oSubfolder         For Each oFile In oFolder.Files             '...insert any file processing code here...         Next oFile     Loop  End Sub 

You can use a queue for FIFO behaviour (shown above), or you can use a stack for LIFO behaviour which would process in the same order as a recursive approach (replace Set oFolder = queue(1) with Set oFolder = queue(queue.Count) and replace queue.Remove(1) with queue.Remove(queue.Count), and probably rename the variable...)

like image 32
Cor_Blimey Avatar answered Sep 19 '22 21:09

Cor_Blimey