【VBScript】サブフォルダも検索してファイル一覧を取得するには

  • [記事公開]2022.12.16
  • VBS

昨日書いたこの記事の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マクロもダメ!というところは、今でもありますね。

何かの参考になれば幸いです。