個々のファイルを循環するスクリプトは正常に機能しますが、複数のディレクトリを調べたり検索したりする必要があります。ハマった....
物事が起こる必要がある順序:
- ユーザーは、必要なもののルート ディレクトリを選択するよう求められます
- そのルート ディレクトリ内のフォルダを探すスクリプトが必要です
- スクリプトが 1 つを見つけると、最初の 1 つを開きます (すべてのフォルダーなので、フォルダーの特定の検索フィルターはありません)。
- 開くと、スクリプトはフォルダー内のすべてのファイルをループし、必要な処理を実行します
- 終了後、ファイルを閉じ、ディレクトリを閉じて次のディレクトリに移動します。
- すべてのフォルダが開かれる/スキャンされるまでループします
これは私が持っているものですが、うまくいきませんし、間違っていることはわかっています:
MsgBox "Please choose the folder."
Application.DisplayAlerts = False
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = "\\blah\test\"
.AllowMultiSelect = False
If .Show <> -1 Then MsgBox "No folder selected! Exiting script.": Exit Sub
CSRootDir = .SelectedItems(1)
End With
folderPath = Dir(CSRootDir, "\*")
Do While Len(folderPath) > 0
Debug.Print folderPath
fileName = Dir(folderPath & "*.xls")
If folderPath <> "False" Then
Do While fileName <> ""
Application.ScreenUpdating = False
Set wbkCS = Workbooks.Open(folderPath & fileName)
--file loop scripts here
Loop 'back to the Do
Loop 'back to the Do
最終コード。各サブディレクトリ内のすべてのサブディレクトリとファイルを循環します。
Dim FSO As Object, fld As Object, Fil As Object
Dim fsoFile As Object
Dim fsoFol As Object
Dim fileName As String
MsgBox "Please choose the folder."
Application.DisplayAlerts = False
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = "\\blah\test\"
.AllowMultiSelect = False
If .Show <> -1 Then MsgBox "No folder selected! Exiting script.": Exit Sub
folderPath = .SelectedItems(1)
End With
If Right(folderPath, 1) <> "\" Then folderPath = folderPath + "\"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set fld = FSO.getfolder(folderPath)
If FSO.folderExists(fld) Then
For Each fsoFol In FSO.getfolder(folderPath).subfolders
For Each fsoFile In fsoFol.Files
If Mid(fsoFile.Name, InStrRev(fsoFile.Name, ".") + 1) = "xls" Then
fileName = fsoFile.Name
Application.ScreenUpdating = False
Set wbkCS = Workbooks.Open(fsoFile.Path)
'My file handling code
End If
Next
Next
End If