【VBScript】サブフォルダも検索してファイル一覧を取得するには
昨日書いたこの記事のVBScript版です。VBScriptで特定のフォルダ配下のサブフォルダも検索してすべてのファイル一覧を取得する方法を紹介します。
環境
環境は、昨日の記事と同じ環境です。
こういうフォルダ構成です。
C:\test>tree /f
フォルダー パスの一覧: ボリューム Windows-SSD
ボリューム シリアル番号は D0EF-3D22 です
C:.
│ results-001-タイプAとタイプBを比較.pptx
│ results-002-タイプAとタイプCを比較.pptx
│ results-003-タイプBとタイプCを比較.pptx
│ results-004-タイプCとタイプDを比較.pptx
│ test.jpg
│
└─Sub1
│ 果物.xlsx
│
└─Sub2
aaaa.txt
コード
VBScriptでサブフォルダも検索してファイル一覧を取得するには、VBA同様、FileSystemObjectを使います。
Option Explicit
Main
Public Sub Main()
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject") '---①
Dim stFiles
Set stFiles = CreateObject("Scripting.Dictionary") '---②
Dim oFolder
Set oFolder = FSO.GetFolder("C:\test")
Call GetFileRe(oFolder, stFiles)
Dim oExcel
If stFiles.Count > 0 Then
Dim vOut, ii
vOut = stFiles.Keys '---③
Set oExcel = CreateObject("Excel.Application")
With oExcel.Workbooks.Add
'---④
.Worksheets(1).Cells(2, 2).Resize(UBound(vOut) + 1, 1).Value = oExcel.WorksheetFunction.Transpose(vOut)
End With
End If
oExcel.Visible = True '---⑤
Set oExcel = Nothing
Set oFolder = Nothing
Set FSO = Nothing
Set stFiles = Nothing
WScript.Quit
End Sub
'---⑥再帰呼出するサブ関数
Private Sub GetFileRe(oFolder, ByRef stFiles)
Dim oFol
Dim oFile
For Each oFol In oFolder.SubFolders
'再帰呼出
Call GetFileRe(oFol, stFiles)
Next
For Each oFile In oFolder.Files
'コレクション(辞書)に追加
stFiles.Add oFile.path, oFile.path
Next
End Sub
VBAと違うのは、型指定がない点と、コレクションが使えない点です。
解説
ロジック自体はVBAと変えていません
①の解説
FileSystemObjectをクリエイトしています。
サブ関数の中でFileSystemObjectをクリエイトしているコードは嫌なので、先にここでクリエイトしています。
②の解説
検索した結果をアウトプットするために、いったんコレクションに値を格納しておきます。VBScriptではなぜかコレクションが使えないので、代わりにDictionaryを使っています。
Collectionがなぜ使えないのかは不明です。バグだとかいううわさも聞きましたが、どうなんでしょうね?
③の解説
DictionaryのKeysプロパティをいったん変数vOutに格納しています。
④の解説
一時的にExcelを生成して、検索した結果をワークシートに吐き出しています。
LBound(vOut)が0で、UBound(vOut)が6です。
Resizeするときは、6だと1個足りないので、プラス1にしてあります。
この辺は、コーディングしているときには間違っていても、デバッグしたときに気が付くので、いつも適当~です。
⑤の解説
Excelはデフォルトでは非表示になるので、ここでVisibleをTrueにしています。
⑥の解説
VBAから変えたのは、型指定をとったところだけです。
まとめ
VBScriptでサブフォルダを検索してファイル一覧を取得する必要に迫られる状況というのは、あまり考えにくいのですが、かつて企業につとめていたときに、取引先にそういうところがありましたので、作ってみました。
客先に行くと、セキュリティががちがちで、Excelマクロもダメ!というところは、今でもありますね。
何かの参考になれば幸いです。
-
前の記事
フォルダ配下(サブフォルダも)ファイル一覧を取得するには【CMD】【ExcelVBA】 2022.12.15
-
次の記事
【裁判所】人間観察または雑感 2022.12.17