フォルダ内のExcelファイルから特定のデータを抽出し、メインのExcelファイルに転記

以下が、タイトルのサンプルマクロです。

Sub TransferData()

    ' tblResultテーブルの列数を取得する
    Dim 列数 As Long
    列数 = wsTBL.Range("tblResult[#All]").Columns.Count

    ' 3列目以降の余分な列を削除
    Dim clm As Long
    If 列数 > 2 Then
        ' 3列目以降の列を順番に削除
        For clm = 3 To 列数
            wsTBL.ListObjects("tblResult").ListColumns(3).Delete
        Next clm
    End If

    ' 抽出対象ファイル名が空でない場合、tblResultテーブルのデータをクリア
    If wsTBL.Range("tblResult[抽出対象ファイル名]")(1) <> "" Then
        wsTBL.ListObjects("tblresult").DataBodyRange.Delete
    End If

    ' 見出しを設定
    Dim rw As Long
    With wsTBL
        ' 抽出設定の最大行数を取得
        maxRw = .Range("tblSetting[#Data]").Rows.Count
        For rw = 1 To maxRw
            .Range("tblResult[#All]")(0).Offset(0, rw + 1) = "抽出id=" & .Range("tblSetting[id]")(rw)
        Next rw
    End With
    
    ' 保管先フォルダのパスを指定
    Dim folderName As String
    folderName = ThisWorkbook.Path & "\保管先"

    ' 処理するファイルの拡張子を配列に格納
    Dim myArray As Variant
    myArray = Array("xlsx") ' xlsxファイルのみ対象とする

    ' 指定したフォルダ内のファイルに対して処理を実行
    Call ProcessFilesInFolderIncludeExtension(folderName, myArray)

End Sub


'**********************************
'* 指定したフォルダ内のファイルに対して同じ処理を行うサブプロシージャ
'* folderPath:フォルダパス名
'* myArray:対象となるファイルの拡張子が格納された配列
Private Sub ProcessFilesInFolderIncludeExtension(ByVal folderPath As String, ByRef myArray As Variant)
    Dim fso As Object
    Dim file As Object

    ' FileSystemObjectを作成して、ファイル操作を簡略化
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' 指定されたフォルダ内の各ファイルに対して処理を実行
    For Each file In fso.GetFolder(folderPath).Files
        ' ファイルの拡張子を取得
        Dim extension As String
        extension = fso.GetExtensionName(file.Name)

        ' ファイルの拡張子が配列に含まれるか確認
        Dim flg As Boolean: flg = False
        Dim i As Long
        For i = LBound(myArray) To UBound(myArray)
            If myArray(i) = extension Then
                ' 拡張子が一致した場合
                flg = True
                Exit For
            End If
        Next i

        ' 拡張子が一致した場合、ファイルに対する処理を実行
        If flg Then
            Call ProcessFile(file)
        End If
    Next file

    ' オブジェクトのメモリ解放
    Set fso = Nothing
End Sub

'**********************************
'* 各ファイルに対する処理を行うサブプロシージャ
'* file:Fileオブジェクト
Private Sub ProcessFile(ByRef file As Object)

    ' ファイルを開く
    Dim wb As Workbook
    Set wb = Workbooks.Open(file.Path)

    ' 処理対象のブックをアクティブにする
    ThisWorkbook.Activate

    ' 各種変数の宣言
    Dim rw As Long        ' 抽出対象の行番号
    Dim maxRw As Long     ' 抽出設定シートの最大行
    Dim シート名 As String  ' 抽出シート名
    Dim セルアドレス As String  ' 抽出セルのアドレス
    Dim 転記データ As Variant   ' 抽出したデータの格納先

    ' tblResultの最終行を取得
    Dim lastRw As Long
    lastRw = wsTBL.Range("tblResult[#Data]").Rows.Count
    If lastRw = 1 Then
        ' 抽出対象ファイル名が空の場合は0行として扱う
        If wsTBL.Range("tblResult[抽出対象ファイル名]") = "" Then
            lastRw = 0
        End If
    End If
    lastRw = lastRw + 1

    ' tblResultに開いたファイル名を転記
    wsTBL.Range("tblResult[抽出対象ファイル名]")(lastRw) = wb.Name

    ' tblSettingシートから抽出設定を読み込み、抽出処理を行う
    With wsTBL
        ' 抽出設定の最大行数を取得
        maxRw = .Range("tblSetting[#Data]").Rows.Count

        ' 各設定に従い、データを抽出してtblResultに転記
        For rw = 1 To maxRw
            シート名 = .Range("tblSetting[抽出シート名]")(rw) ' 抽出するシート名
            セルアドレス = .Range("tblSetting[抽出セル番号]")(rw) ' 抽出するセルのアドレス
            
            ' 指定されたシートとセルからデータを取得
            転記データ = wb.Worksheets(シート名).Range(セルアドレス)
            
            ' 抽出したデータをtblResultの該当する列に転記
            .Range("tblResult[抽出対象ファイル名]")(lastRw).Offset(0, rw) = 転記データ
        Next rw
    End With

    ' 処理が終わったらブックを閉じる
    wb.Close

End Sub

このマクロは、指定されたフォルダ内のExcelファイル(拡張子が .xlsx)から特定のデータを抽出し、メインのExcelファイルに転記するためのものです。以下で、マクロ全体の動作を詳しく説明します。


TransferData プロシージャ

  1. tblResultの列数を取得し、余分な列を削除
    • マクロは、tblResultというテーブルの全体の列数を取得し、3列目以降の列を削除します。
    • 列数が2より大きい場合、3列目以降が不要な列と見なし、これらを削除します。
  2. テーブルデータのクリア
    • 次に、tblResultの「抽出対象ファイル名」列の最初のセルが空でない場合、そのデータ部分をすべてクリアします(つまり、以前の処理結果を消去)。
  3. 抽出設定の列見出しの設定
    • tblSettingシートに記載された各データ抽出の設定(id列に格納されている値)に基づいて、新しい列の見出し(”抽出id=” と設定されたid)をtblResultに追加します。見出しは、データを格納する列の1行目に設定されます。
  4. フォルダ内のファイルを処理
    • データを処理するフォルダのパスを folderName に設定し、処理対象のファイル拡張子(xlsx)を myArray 配列に格納します。
    • 指定されたフォルダ内のファイルに対して処理を実行するため、ProcessFilesInFolderIncludeExtension サブプロシージャを呼び出します。

ProcessFilesInFolderIncludeExtension プロシージャ

  1. フォルダ内のファイルを処理
    • folderPath(フォルダのパス)を受け取り、そのフォルダ内にあるすべてのファイルをループで処理します。
    • 各ファイルの拡張子を取得し、処理対象の拡張子(myArrayに含まれるもの)かどうかを確認します。
  2. 拡張子が一致する場合、ファイルに対する処理を実行
    • 拡張子が一致する場合、ProcessFile サブプロシージャが呼び出され、そのファイルに対してデータ抽出処理が行われます。

ProcessFile プロシージャ

  1. ファイルのオープン
    • 指定されたファイル(file.Path)を開き、対象のExcelブックを操作可能にします。
  2. 最終行の取得とファイル名の記録
    • tblResultの最終行を取得し、データの転記を行う行を決定します。
    • 新しいファイル名をその行に記録します。これにより、どのファイルからデータが抽出されたかが記録されます。
  3. データの抽出と転記
    • tblSettingシートに基づいて、指定されたシートとセルからデータを抽出します。各設定行には「抽出シート名」と「抽出セル番号」が設定されており、これらに従ってデータを取得します。
    • 取得したデータを、tblResultの該当する列に転記します。各抽出対象ごとに、列を右にずらしてデータを配置します。
  4. ファイルのクローズ
    • すべてのデータを抽出した後、開いていたファイルを閉じます。

全体の動作

このマクロは、以下の順序で動作します。

  1. 既存データのクリア: tblResultテーブルの余分な列や古いデータを削除。
  2. 列の設定: tblSettingシートに基づき、tblResultの列見出しを設定。
  3. ファイルの処理: 指定されたフォルダから xlsx ファイルを一つずつ開き、必要なデータを抽出。
  4. データの転記: 抽出されたデータを tblResultテーブルに転記。
  5. ファイルのクローズ: 処理が終わったファイルを閉じて、次のファイルに進む。

このマクロの目的は、大量のExcelファイルから特定のデータを抽出し、それを一つの結果シートにまとめることです。ファイルの名前や抽出対象のセル情報が設定されていれば、効率的にデータを集約できるようになっています。


使用例

「転記」ボタンにより、マクロが実行されます。マクロが実行されると、このマクロファイルを保管しているフォルダ内の「保管先」フォルダ内のファイル(.xlsx)から、以下の左の表の「id」「抽出シート名」「抽出シート名」を参照して、右の表を作成しています。


マクロファイルのダウンロード

以下より、マクロファイルをダウンロードして、利用してください。

Follow me!