crepe
asked on
Loop through all Folders and SubFolders
Good evening,
How can I change the following code to select a folder and look for all *.data files within that folder and subfolders?
Thank you!
How can I change the following code to select a folder and look for all *.data files within that folder and subfolders?
Thank you!
Sub DoIt()
Dim fld As FileDialog
Dim sFolderLoc As String
Dim iCurrentRow As Long
Dim i As Long
Dim sTxtFilename As String
Dim j As Long
Dim sLine As String
Dim sComputedResults
Dim sComputedMaximum
Dim sComputedMinimum
With ThisWorkbook.ActiveSheet
.Range("A1") = "File Name"
.Range("B1") = "Computed Results"
.Range("C1") = "Blank"
.Range("D1") = "Computed Maximum"
.Range("E1") = "Computed Minimum"
End With
iCurrentRow = 1
'sFolderLoc = ThisWorkbook.ActiveSheet.Cells(2, 9).Value
'Set fld = Application.FileDialog(msoFileDialogFolderPicker)
'open file picker instead of a folder picker
Set fld = Application.FileDialog(msoFileDialogFilePicker)
'set file picker dialog preferences
With fld
.Title = "Pick your file type"
.AllowMultiSelect = False
'you may want to comment out the next two lines if you want to allow users to select a variety of file types
.Filters.Clear
.Filters.Add "Text Files", "*.data"
If .Show <> -1 Then GoTo Exit_DoIt
sFolderLoc = fld.SelectedItems(1)
End With
'sTxtFilename = ThisWorkbook.ActiveSheet.Cells(2, 10).Value
'set file type based upon what the user has selected
sTxtFilename = "*." & Right(sFolderLoc, Len(sFolderLoc) - InStrRev(sFolderLoc, "."))
sComputedResults = "Computed Results: "
sComputedMaximum = "Computed Maximum: "
sComputedMinimum = "Computed Minimum: "
'set folder based upon location of file user has selected
sFolderLoc = Left(sFolderLoc, InStrRev(sFolderLoc, "\"))
' this assumes all files of type data are your data
sTxtFilename = Dir(sFolderLoc & "\" & sTxtFilename)
Do While sTxtFilename <> ""
iCurrentRow = iCurrentRow + 1
Open sFolderLoc & "\" & sTxtFilename For Input As #1
' no error checking here, assumes all txt files are ok
Do While Not EOF(1)
Input #1, sLine
If Left(sLine, Len(sComputedResults)) = sComputedResults Then
sLine = Right(sLine, Len(sLine) - Len(sComputedResults))
ThisWorkbook.ActiveSheet.Range("B" & iCurrentRow) = sLine
ElseIf Left(sLine, Len(sComputedMaximum)) = sComputedMaximum Then
sLine = Right(sLine, Len(sLine) - Len(sComputedMaximum))
ThisWorkbook.ActiveSheet.Range("D" & iCurrentRow) = sLine
ElseIf Left(sLine, Len(sComputedMinimum)) = sComputedMinimum Then
sLine = Right(sLine, Len(sLine) - Len(sComputedMinimum))
ThisWorkbook.ActiveSheet.Range("E" & iCurrentRow) = sLine
End If
Loop
ThisWorkbook.ActiveSheet.Range("A" & iCurrentRow) = sTxtFilename
Close #1
'find next txt file
sTxtFilename = Dir
Loop
Exit_DoIt:
Set fld = Nothing
End Sub
ASKER
Almost! I also want it to check all subfolders within the selected folder.
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
Hi crepe,
try this update, with a subfolder function:
try this update, with a subfolder function:
Sub DoIt1()
Dim fld As FileDialog
Dim sFolderLoc As String
Dim iCurrentRow As Long
Dim i As Long
Dim sTxtFilename As String
Dim j As Long
Dim sLine As String
Dim sComputedResults
Dim sComputedMaximum
Dim sComputedMinimum, myArr, lSubLoop As Long
With ThisWorkbook.ActiveSheet
.Range("A1") = "File Name"
.Range("B1") = "Computed Results"
.Range("C1") = "Blank"
.Range("D1") = "Computed Maximum"
.Range("E1") = "Computed Minimum"
End With
iCurrentRow = 1
'sFolderLoc = ThisWorkbook.ActiveSheet.Cells(2, 9).Value
Set fld = Application.FileDialog(msoFileDialogFolderPicker)
'open file picker instead of a folder picker
'Set fld = Application.FileDialog(msoFileDialogFilePicker)
'set file picker dialog preferences
With fld
.Title = "Pick your Folder"
.AllowMultiSelect = False
'you may want to comment out the next two lines if you want to allow users to select a variety of file types
'.Filters.Clear
'.Filters.Add "Text Files", "*.data"
.Show
'If .Show <> -1 Then GoTo Exit_DoIt
sFolderLoc = fld.SelectedItems(1)
End With
myArr = GetSubFolders(sFolderLoc)
Set wbk1 = Workbooks.Add
For lSubLoop = LBound(myArr) To UBound(myArr)
sTxtFilename = Dir(sFolderLoc & "\" & myArr(lSubLoop) & "\*.data")
'sTxtFilename = ThisWorkbook.ActiveSheet.Cells(2, 10).Value
'set file type based upon what the user has selected
sTxtFilename = "*." & Right(sFolderLoc, Len(sFolderLoc) - InStrRev(sFolderLoc, "."))
sComputedResults = "Computed Results: "
sComputedMaximum = "Computed Maximum: "
sComputedMinimum = "Computed Minimum: "
' this assumes all files of type data are your data
sTxtFilename = Dir(sFolderLoc & "\" & myArr(lSubLoop) & "\" & sTxtFilename)
Do While sTxtFilename <> ""
iCurrentRow = iCurrentRow + 1
Open sFolderLoc & "\" & myArr(lSubLoop) & "\" & sTxtFilename For Input As #1
' no error checking here, assumes all txt files are ok
Do While Not EOF(1)
Input #1, sLine
If Left(sLine, Len(sComputedResults)) = sComputedResults Then
sLine = Right(sLine, Len(sLine) - Len(sComputedResults))
ThisWorkbook.ActiveSheet.Range("B" & iCurrentRow) = sLine
ElseIf Left(sLine, Len(sComputedMaximum)) = sComputedMaximum Then
sLine = Right(sLine, Len(sLine) - Len(sComputedMaximum))
ThisWorkbook.ActiveSheet.Range("D" & iCurrentRow) = sLine
ElseIf Left(sLine, Len(sComputedMinimum)) = sComputedMinimum Then
sLine = Right(sLine, Len(sLine) - Len(sComputedMinimum))
ThisWorkbook.ActiveSheet.Range("E" & iCurrentRow) = sLine
End If
Loop
ThisWorkbook.ActiveSheet.Range("A" & iCurrentRow) = sTxtFilename
Close #1
'find next txt file
sTxtFilename = Dir
Loop
Next lSubLoop
Exit_DoIt:
Set fld = Nothing
End Sub
Function GetSubFolders(RootPath As String)
'function plundered from Patrick Matthews, EE comment 19880728
Dim arr() As String
Dim FSO As Object
Dim fld As Object
Dim sf As Object
Dim Counter As Long
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
Set fld = FSO.GetFolder(RootPath)
ReDim arr(1 To fld.SubFolders.Count) As String
For Each sf In fld.SubFolders
Counter = Counter + 1
arr(Counter) = sf.Name
Next
GetSubFolders = arr
Set sf = Nothing: Set fld = Nothing: Set FSO = Nothing
End Function
ASKER
Worked perfectly! Thank you.
your welcome.
gowflow
gowflow
Open in new window
gowflow