View Single Post
  #6   Report Post  
Posted to microsoft.public.excel.programming
joel joel is offline
external usenet poster
 
Posts: 9,101
Default "Listing Contents of Sub-Folders"

Below I copied the example code from VBA help for subfolders. the code is
written for fileSearch which may not work on Excel 2007 but will work for
excel 2003. there arre similar methods that can be used without fileSearch.
You can use DIR instead of the FileSeaqrch methods. I have written similar
code, but it is not as well documented as the code below.

I put my code that gets every file and puts the filename and size on a
worksheet after the code I found in the VBA help.

VBA help code

Sub SearchEveryFolder()

'Declare variables that reference a
'SearchScope and a ScopeFolder object.
Dim ss As SearchScope
Dim sf As ScopeFolder

'Declare a variable to act as a generic counter.
Dim lngCount As Long

'Use a With...End With block to reference the
'FileSearch object.
With Application.FileSearch

'Clear all the parameters of the previous searches.
'This method doesn't clear the LookIn property or
'the SearchFolders collection.
.NewSearch

'Specify the type of file for which to search.
'Use the FileType property to specify the first type
'and then add additional types to the FileTypes collection.
.FileType = msoFileTypeWebPages
.FileTypes.Add msoFileTypeExcelWorkbooks

'Clear the SearchFolder collection by
'looping through each ScopeFolder object
'and removing it.
For lngCount = 1 To .SearchFolders.Count
.SearchFolders.Remove lngCount
Next lngCount

'Loop through the SearchScopes collection to find
'the scope in which you want to search. In this
'case the scope is the local machine.
For Each ss In .SearchScopes
Select Case ss.Type
Case msoSearchInMyComputer

'Loop through each ScopeFolder in
'the ScopeFolders collection of the
'SearchScope object.
For Each sf In ss.ScopeFolder.ScopeFolders

'Call a function that loops through all
'of the subfolders of the root ScopeFolder.
'This function adds any folders named "1033" to the
'SearchFolders collection.
Call OutputPaths(sf.ScopeFolders, "1033")

Next sf
Case Else
End Select
Next ss

'Test to see if any ScopeFolders collections were added to
'the SearchFolders collection.
If .SearchFolders.Count 0 Then

'Set the LookIn property to the path of
'the first ScopeFolder object in the SearchFolders
'collection. This is here so that any previous
'setting of the LookIn property doesn't affect
'the search.
.LookIn = .SearchFolders.Item(1).Path

'Execute the search and test to see if any files
'were found.
If .Execute < 0 Then

'Display the number of files found.
MsgBox "Files found: " & .FoundFiles.Count

'Loop through the list of found files and
'display the path of each one in a message box.
For lngCount = 1 To .FoundFiles.Count
If MsgBox(.FoundFiles.Item(lngCount), vbOKCancel, _
"Found files") = vbCancel Then

'Break out of the loop
lngCount = .FoundFiles.Count

End If
Next lngCount
End If
End If
End With
End Sub

'This subroutine loops through all of the ScopeFolders collections
'in a given ScopeFolders collection. It adds any folder
'that has the same name as the value of strFolder
'to the SearchFolders collection.
Sub OutputPaths(ByVal sfs As ScopeFolders, _
ByRef strFolder As String)

'Declare a variable as a ScopeFolder object
Dim sf As ScopeFolder

'Loop through each ScopeFolder object in the
'ScopeFolders collection.
For Each sf In sfs

'Test to see if the folder name of the ScopeFolder
'matches the value of strFolder. Use LCase to ensure
'that case does not affect the match.
If LCase(sf.Name) = LCase(strFolder) Then

'Add the ScopeFolder to the SearchFolders collection.
sf.AddToSearchFolders

End If

'Include a DoEvents call because there is the potential for this
'loop to last a long time. The DoEvents call allows this process to
'continue handling events.
DoEvents

'Test to see if the ScopeFolders collection in the
'current ScopeFolder is empty. If it isn't empty, then
'that means that the current ScopeFolder object contains subfolders.
If sf.ScopeFolders.Count 0 Then

'This subroutine recursively calls itself so that
'it can add the subfolders of the current ScopeFolder object
'to the SearchFolders collection.
Call OutputPaths(sf.ScopeFolders, strFolder)

End If
Next sf
End Sub

----------------------------------------------------------------------
My code which lists every file found on a worksheet


Dim RowNumber
Sub GetFolderSize()

strFolder = "C:"
RowNumber = 1

Set fso = CreateObject _
("Scripting.FileSystemObject")
Set folder = _
fso.GetFolder(strFolder)

Sheets(1).Cells(RowNumber, 1) = strFolder + "\"
Sheets(1).Cells(RowNumber, 2) = folder.Size
RowNumber = RowNumber + RowNumber

Call GetSubFolderSize(strFolder + "\")
End Sub

Sub GetSubFolderSize(strFolder)
Set fso = CreateObject _
("Scripting.FileSystemObject")

Set folder = _
fso.GetFolder(strFolder)

If folder.subfolders.Count 0 Then
For Each sf In folder.subfolders
On Error GoTo 100
Call GetSubFolderSize(strFolder + sf.Name + "\")
100 Next sf
End If
'folder size in bytes
On Error GoTo 200
If Not folder.isrootfolder Then
FolderSize = folder.Size
Sheets(1).Cells(RowNumber, 2) = FolderSize
Sheets(1).Cells(RowNumber, 1) = strFolder
RowNumber = RowNumber + 1
End If

200 On Error GoTo 0

End Sub



-----------------------------------------------------------------------


"Don" wrote:

Bob...I am using 2002 but don't seem to be able to get a handle on this. I
response to Leith explains my goal. Thanks for the reply,

Don

"Bob Phillips" wrote:

Filesearch has a subfolders property, but be aware this has been removed in
Excel 2007.

--
---
HTH

Bob

(there's no email, no snail mail, but somewhere should be gmail in my addy)



"Don" wrote in message
...
Here's a snippit of code (attached to a userform) that I use to list files
contained in a folder. This code only picks up files contained in the
folder
selected and not in any sub-folders of that folder. What change(s) do I
need
to make so that the code identifies files contained in sub-floders also?

If OptionButton1 Then
EXT = "*.MP3"
ElseIf OptionButton2 Then
EXT = "*.CDG"
ElseIf OptionButton3 Then
EXT = "*.ZIP"
ElseIf OptionButton4 Then
EXT = "*.*"
End If
With Application.FileDialog(msoFileDialogFolderPicker)
.Show
ThePath = .SelectedItems(1) & "\"
End With
fname = Dir(ThePath & EXT)

TIA...Don