【入門編】【フォルダ走査】GetFolderとFilesコレクションを用いた指定拡張子(.csv / .xlsx)ファイルの一覧取得 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!業務自動化の現場を駆け抜けてきた先輩エンジニアです。

日々の業務の中で、「特定のフォルダにある大量のファイルから、特定の拡張子(例えば `.csv` や `.xlsx`)のファイルだけを拾い上げて処理したい」という要件に直面したことはありませんか?
手作業でファイルを1つずつ確認してコピペしていたら、それだけで貴重な時間が溶けてしまいますよね。

今回は、VBScriptの真骨頂であるFileSystemObject(FSO)を駆使し、フォルダの中身を美しく、そして高速に走査する極意を伝授します。ここをクリアすれば、あなたのファイル操作スキルは一気にプロの領域へ到達しますよ。さあ、一緒に扉を開けていきましょう!

—

1. フォルダ走査の全体像とFSOの哲学

VBScriptでファイルシステムを操作する場合、避けて通れないのが `Scripting.FileSystemObject` というオブジェクトです。
これはWindowsのファイルシステム(Cドライブやネットワークドライブ)へアクセスするための「万能パスポート」だと思ってください。

今回のミッションである「特定フォルダから特定拡張子のファイルを探す」アプローチは、以下の3ステップで構成されます。

1. FSOを召喚する:ファイルシステムを操るためのインスタンスを作成する。
2. フォルダオブジェクトを取得する:`GetFolder` メソッドで、ターゲットのフォルダを指し示す。
3. コレクションをイテレート(巡回)する:フォルダ内の全ファイルが入った `Files` コレクションをループで1つずつめくり、拡張子をチェックする。

図解すると、このようなイメージです。

[ 指定フォルダ ] (GetFolder)
│
├─ 📄 data.txt -> ❌ 対象外
├─ 📄 sales.csv -> ⭕ MATCH! (処理実行)
├─ 📊 report.xlsx -> ⭕ MATCH! (処理実行)
└─ 📁 archive -> (サブフォルダは今回はスキップ)

このシンプルな構造をコードに落とし込んでいきます。

—

2. 実践! `.csv` と `.xlsx` を華麗に捕獲するVBScriptコード

実務でそのままコピペして使える、堅牢で丁寧なコメント付きのサンプルコードを用意しました。メモ帳などのテキストエディタに貼り付けて、拡張子を `.vbs` にして保存すればすぐに実行できます。

‘ ==============================================================================
‘ スクリプト名: FilterFilesSample.vbs
‘ 概要: 指定フォルダ内のファイルを走査し、.csvと.xlsxファイルのみを抽出して処理する
‘ ==============================================================================

Option Explicit ‘ 宣言漏れによるバグを防ぐ(プロの基本作法です)

Sub Main()
‘ — 1. 変数の宣言 —
Dim fso, targetFolderPath, targetFolder, fileList, targetFile
Dim targetExt1, targetExt2, fileExt
Dim processedCount

‘ — 2. 各種設定 —
‘ 処理対象のフォルダパス(ご自身の環境に合わせて書き換えてください)
targetFolderPath = “C:\Work\DataFolder”

‘ 抽出したい拡張子(大文字・小文字を無視して比較するため小文字で定義)
targetExt1 = “csv”
targetExt2 = “xlsx”

processedCount = 0

‘ — 3. FileSystemObjectの生成 —
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ フォルダが存在するかチェック(エラーハンドリングの第一歩)
If Not fso.FolderExists(targetFolderPath) Then
MsgBox “指定されたフォルダが存在しません:” & vbCrLf & targetFolderPath, vbCritical, “エラー”
Exit Sub
End If

‘ — 4. フォルダオブジェクトの取得 —
Set targetFolder = fso.GetFolder(targetFolderPath)

‘ フォルダ内の全ファイルが入っている「Filesコレクション」を取得
Set fileList = targetFolder.Files

‘ — 5. コレクションの走査(ループ処理) —
For Each targetFile In fileList
‘ 拡張子を小文字に統一して取得(例: “CSV” -> “csv”)
fileExt = LCase(fso.GetExtensionName(targetFile.Name))

‘ 拡張子が .csv または .xlsx の場合のみ処理を実行
If fileExt = targetExt1 Or fileExt = targetExt2 Then
‘ 【ここに実際の業務ロジックを記述】
WScript.Echo “発見・処理対象: ” & targetFile.Name & ” (パス: ” & targetFile.Path & “)”

processedCount = processedCount + 1
End If
Next

‘ — 6. 後片付けと結果報告 —
Set fileList = Nothing
Set targetFolder = Nothing
Set fso = Nothing

MsgBox “処理が完了しました。” & vbCrLf & “対象ファイル数: ” & processedCount & “件”, vbInformation, “完了”
End Sub

‘ メイン処理の実行
Main()

—

3. コードの急所を徹底解説!

なぜこの書き方が「プロの知見」と言えるのか、重要なポイントを3つに絞って解説します。

① `Option Explicit` と変数の明示的宣言

VBScriptでは省略可能な `Option Explicit` ですが、実務では絶対に外してはいけない呪文です。これを記述することで、うっかり変数名をタイポ(誤字)した際に、スクリプトが勝手に新しい変数を作ってしまい、原因不明のバグに悩まされる悲劇を未然に防ぎます。

② `LCase` による大文字・小文字の揺れ対策

Windowsの世界では拡張子の「.CSV」と「.csv」は同じものとして扱われますが、プログラムの厳密な文字列比較では `csv` と `CSV` は別物と判定されてしまいます。
`LCase(fso.GetExtensionName(…))` を使ってあらかじめ小文字に統一してから比較することで、人間のうっかりミスによる「見落としバグ」を完全に封殺しています。

③ コレクションの解放(メモリ管理の美学)

VBScript(背後にあるCOMコンポーネント)は、スクリプトが終了すれば自動的にメモリが解放されますが、大規模な処理や長寿なスクリプトを書く場合、使い終わったオブジェクト(`fso`, `targetFolder` など)は `Set 〇〇 = Nothing` で明示的に解放する癖をつけましょう。これが美しいコードを書くエンジニアの作法です。

—

4. 現場でよくある「ハマりどころ」と対策

最後に、初学者が必ずといっていいほど躓くポイントを先回りして共有しておきます。

  • Q. サブフォルダ(階層下のフォルダ)の中にあるファイルがヒットしません。
  • A. 今回使用した `GetFolder.Files` は、あくまで「指定されたフォルダの直下」にあるファイルしか返しません。もし下層フォルダまでくまなく探したい(再帰処理を行いたい)場合は、`SubFolders` コレクションを再帰的に呼び出す関数を組む必要があります。まずは直下の処理をマスターしてから挑戦してみてください!
  • Q. ファイル名に日本語が含まれていると文字化けします。
  • A. VBScriptの `WScript.Echo` や `MsgBox` は、実行する環境(OSの言語設定)に依存します。Shift_JIS(ANSI)で保存されているか、文字コード周りでエラーが出る場合は、スクリプトファイルの保存エンコーディングを「ANSI(CP932)」にしてみてください。

—

おわりに

お疲れ様でした!今回は `GetFolder` と `Files` コレクションを組み合わせた、ファイル走査の王道パターンの極意をお伝えしました。

このパターンを自分のものにできれば、毎朝のルーティンワークである「ダウンロードフォルダの整理」「集計前データの抽出」などを一瞬で自動化できるようになります。

ここをクリアしたあなたなら、もうVBScriptの基本はバッチリです。自信を持って、日々の業務自動化に挑んでくださいね!それでは、また次の現場でお会いしましょう。

タイトルとURLをコピーしました