【Excel VBA】特定拡張子のファイルだけを効率的に抽出・検索する方法

Excel・VBA

はじめに

Excel VBAを活用して業務を自動化している皆さん、こんにちは!
今回は、特定のフォルダ内にある数多くのファイルの中から、「特定の拡張子を持つファイルだけを抽出したい」という、よくあるニーズに応えるVBAマクロの作成方法を解説します。

例えば、「PDFファイルだけをリストアップしたい」「Excelファイル(.xlsx)だけを処理したい」といった場面で、このテクニックは非常に役立ちます。手作業でファイルを探す手間を省き、業務効率を格段に向上させましょう。

Excel VBAで特定拡張子ファイルを抽出する基本

ファイルシステムを操作するVBAマクロでは、「Scripting.FileSystemObject」というオブジェクトが非常に強力です。これを利用することで、フォルダの操作、ファイルの取得、拡張子の判定などを簡単に行うことができます。

基本的な流れは以下の通りです。

  1. 対象となるフォルダを指定します。
  2. 指定したフォルダ内のファイルを一つずつ取得します。
  3. 取得したファイルの拡張子をチェックします。
  4. 条件に合致するファイルがあれば、その情報をExcelシートに書き出すなどの処理を行います。

事前準備:Scripting.FileSystemObjectの利用について

Scripting.FileSystemObjectを利用するには、通常「参照設定」が必要ですが、今回は参照設定なしで利用できる「遅延バインディング」という方法で進めます。これにより、環境に依存せず、すぐにコードを実行できます。

もし、より高速な処理やIDEのコード補完を利用したい場合は、以下の手順で参照設定を行ってください。
VBAエディタ(Alt + F11)を開き、メニューバーの「ツール」→「参照設定」を選択し、「Microsoft Scripting Runtime」にチェックを入れてOKボタンを押してください。

サンプルコード1:単一の拡張子でファイルを抽出する

まずは、特定の拡張子(例: 「.pdf」)を持つファイルだけを抽出するマクロを見てみましょう。このコードは、指定したフォルダ内のPDFファイルのパスをExcelシートのA列にリストアップします。

Sub ExtractSpecificExtensionFiles()
    Dim fso As Object ' FileSystemObjectを宣言
    Dim targetFolder As Object ' 検索対象フォルダ
    Dim file As Object ' フォルダ内のファイル
    Dim folderPath As String ' 検索対象フォルダのパス
    Dim targetExtension As String ' 抽出したい拡張子
    Dim rowNum As Long ' シートの行番号

    ' --- 設定 ---
    folderPath = "C:\Users\YourUser\Documents\TargetFolder" ' ★ここに検索したいフォルダのパスを指定してください
    targetExtension = "pdf" ' ★抽出したい拡張子を小文字で指定してください (例: "xlsx", "docx", "jpg")
    ' -------------

    ' シートの初期化
    Cells.ClearContents
    Range("A1").Value = "抽出ファイルパス"
    rowNum = 2 ' データ書き込み開始行

    ' FileSystemObjectを生成
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' 指定されたフォルダが存在するかチェック
    If Not fso.FolderExists(folderPath) Then
        MsgBox "指定されたフォルダが見つかりません: " & folderPath, vbExclamation
        Set fso = Nothing
        Exit Sub
    End If

    ' フォルダオブジェクトを取得
    Set targetFolder = fso.GetFolder(folderPath)

    ' フォルダ内のファイルを一つずつチェック
    For Each file In targetFolder.Files
        ' 拡張子を取得し、指定された拡張子と一致するか判定
        ' LCase関数で小文字に変換し、大文字・小文字を区別しないようにする
        If LCase(fso.GetExtensionName(file.Name)) = targetExtension Then
            Cells(rowNum, 1).Value = file.Path ' ファイルパスをシートに書き込み
            rowNum = rowNum + 1 ' 次の行へ
        End If
    Next file

    MsgBox "指定された拡張子 (" & targetExtension & ") のファイルの抽出が完了しました。", vbInformation

    ' オブジェクトの解放
    Set file = Nothing
    Set targetFolder = Nothing
    Set fso = Nothing
End Sub

コードの解説

  • Dim fso As Object: FileSystemObjectを格納するための変数を宣言しています。As Objectとすることで、参照設定なしで利用できます。
  • Set fso = CreateObject("Scripting.FileSystemObject"): FileSystemObjectのインスタンスを生成しています。
  • folderPath = "C:\Users\YourUser\Documents\TargetFolder": ここに検索対象としたいフォルダのフルパスを設定します。ご自身の環境に合わせて変更してください。
  • targetExtension = "pdf": 抽出したいファイルの拡張子を、ドット(.)なしで小文字で指定します。
  • If Not fso.FolderExists(folderPath) Then ... End If: 指定されたフォルダが存在するかどうかを確認し、存在しない場合はメッセージを表示して処理を終了します。
  • Set targetFolder = fso.GetFolder(folderPath): 指定したパスからフォルダオブジェクトを取得します。
  • For Each file In targetFolder.Files ... Next file: targetFolder内のすべてのファイル(targetFolder.Files)を一つずつループ処理します。
  • fso.GetExtensionName(file.Name): FileSystemObjectの便利な機能で、ファイル名から拡張子だけを抽出します。例えば「document.pdf」からは「pdf」が返されます。
  • LCase(...) = targetExtension: 取得した拡張子をLCase関数で小文字に変換し、設定したtargetExtensionと比較しています。これにより、「.PDF」のような大文字の拡張子を持つファイルも正しく抽出できます。
  • Cells(rowNum, 1).Value = file.Path: 条件に合致したファイルのフルパスを、Excelシートの指定したセルに書き込んでいます。
  • 最後に、使用したオブジェクトをSet ... = Nothingで解放しています。これはVBAでの良い習慣です。

サンプルコード2:複数の拡張子に対応してファイルを抽出する

次に、複数の種類の拡張子を持つファイル(例: 「.docx」と「.xlsx」の両方)を抽出したい場合のコードです。Select Case文を使うと、複数の条件を簡潔に記述できます。

Sub ExtractMultipleExtensionFiles()
    Dim fso As Object
    Dim targetFolder As Object
    Dim file As Object
    Dim folderPath As String
    Dim rowNum As Long
    Dim fileExtension As String

    ' --- 設定 ---
    folderPath = "C:\Users\YourUser\Documents\TargetFolder" ' ★ここに検索したいフォルダのパスを指定してください
    ' -------------

    ' シートの初期化
    Cells.ClearContents
    Range("A1").Value = "抽出ファイルパス"
    rowNum = 2

    ' FileSystemObjectを生成
    Set fso = CreateObject("Scripting.FileSystemObject")

    If Not fso.FolderExists(folderPath) Then
        MsgBox "指定されたフォルダが見つかりません: " & folderPath, vbExclamation
        Set fso = Nothing
        Exit Sub
    End If

    Set targetFolder = fso.GetFolder(folderPath)

    For Each file In targetFolder.Files
        fileExtension = LCase(fso.GetExtensionName(file.Name)) ' 拡張子を小文字で取得

        ' 複数の拡張子で条件分岐
        Select Case fileExtension
            Case "docx", "xlsx", "pdf" ' ★抽出したい拡張子をカンマ区切りで追加してください
                Cells(rowNum, 1).Value = file.Path
                rowNum = rowNum + 1
            Case Else
                ' 該当しない拡張子のファイルは何もしない
        End Select
    Next file

    MsgBox "複数の拡張子を持つファイルの抽出が完了しました。", vbInformation

    Set file = Nothing
    Set targetFolder = Nothing
    Set fso = Nothing
End Sub

コードの解説

  • fileExtension = LCase(fso.GetExtensionName(file.Name)): 各ファイルの拡張子を小文字で取得し、変数fileExtensionに格納しています。
  • Select Case fileExtension ... End Select: fileExtensionの値に基づいて処理を分岐させています。
    Case "docx", "xlsx", "pdf" の部分で、カンマ区切りで複数の拡張子を指定できます。ここに抽出したい拡張子を追加するだけで、簡単に対応する拡張子を増やすことが可能です。

さらに応用するためのヒント

今回紹介した基本をベースに、さらにマクロを便利にするためのヒントをいくつかご紹介します。

  • サブフォルダも対象にするには?
    現在のコードは指定したフォルダ直下のファイルのみを対象とします。サブフォルダ内のファイルも検索したい場合は、再帰処理(関数内で自分自身を呼び出す処理)を使うか、FileSystemObjectのSubFoldersコレクションをループ処理する必要があります。
  • ユーザーにフォルダを選択させるには?
    Application.FileDialog(msoFileDialogFolderPicker) を使うと、ユーザーがダイアログボックスでフォルダを選択できるようにできます。これにより、マクロの汎用性が高まります。
  • エラー処理の追加
    今回、フォルダが存在しない場合のエラー処理は含めましたが、ファイルが見つからない場合や、VBAの実行中に予期せぬエラーが発生した場合に備え、On Error GoToなどのエラーハンドリングを追加すると、より堅牢なマクロになります。
  • 抽出結果を別のファイルに保存する
    抽出したファイルパスをExcelシートに書き出すだけでなく、テキストファイルやCSVファイルとして保存する機能を追加することも可能です。

まとめ

今回は、Excel VBAを使って特定の拡張子を持つファイルを効率的に抽出する方法を解説しました。Scripting.FileSystemObjectを使いこなすことで、ファイル操作に関する様々な業務を自動化できるようになります。

「このファイル、どこにいったっけ?」と探す手間はもう不要です!ぜひ、ご自身の業務に合わせて今回学んだテクニックを応用し、日々の作業をよりスムーズに、よりスマートに進めてみてください。

最後までお読みいただきありがとうございました。次回もお役立ち情報をお届けしますので、お楽しみに!

コメント

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