フォルダ内の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
プロシージャ
tblResult
の列数を取得し、余分な列を削除- マクロは、
tblResult
というテーブルの全体の列数を取得し、3列目以降の列を削除します。 列数
が2より大きい場合、3列目以降が不要な列と見なし、これらを削除します。
- マクロは、
- テーブルデータのクリア
- 次に、
tblResult
の「抽出対象ファイル名」列の最初のセルが空でない場合、そのデータ部分をすべてクリアします(つまり、以前の処理結果を消去)。
- 次に、
- 抽出設定の列見出しの設定
tblSetting
シートに記載された各データ抽出の設定(id
列に格納されている値)に基づいて、新しい列の見出し(”抽出id=” と設定されたid
)をtblResult
に追加します。見出しは、データを格納する列の1行目に設定されます。
- フォルダ内のファイルを処理
- データを処理するフォルダのパスを
folderName
に設定し、処理対象のファイル拡張子(xlsx
)をmyArray
配列に格納します。 - 指定されたフォルダ内のファイルに対して処理を実行するため、
ProcessFilesInFolderIncludeExtension
サブプロシージャを呼び出します。
- データを処理するフォルダのパスを
ProcessFilesInFolderIncludeExtension
プロシージャ
- フォルダ内のファイルを処理
folderPath
(フォルダのパス)を受け取り、そのフォルダ内にあるすべてのファイルをループで処理します。- 各ファイルの拡張子を取得し、処理対象の拡張子(
myArray
に含まれるもの)かどうかを確認します。
- 拡張子が一致する場合、ファイルに対する処理を実行
- 拡張子が一致する場合、
ProcessFile
サブプロシージャが呼び出され、そのファイルに対してデータ抽出処理が行われます。
- 拡張子が一致する場合、
ProcessFile
プロシージャ
- ファイルのオープン
- 指定されたファイル(
file.Path
)を開き、対象のExcelブックを操作可能にします。
- 指定されたファイル(
- 最終行の取得とファイル名の記録
tblResult
の最終行を取得し、データの転記を行う行を決定します。- 新しいファイル名をその行に記録します。これにより、どのファイルからデータが抽出されたかが記録されます。
- データの抽出と転記
tblSetting
シートに基づいて、指定されたシートとセルからデータを抽出します。各設定行には「抽出シート名」と「抽出セル番号」が設定されており、これらに従ってデータを取得します。- 取得したデータを、
tblResult
の該当する列に転記します。各抽出対象ごとに、列を右にずらしてデータを配置します。
- ファイルのクローズ
- すべてのデータを抽出した後、開いていたファイルを閉じます。
全体の動作
このマクロは、以下の順序で動作します。
- 既存データのクリア:
tblResult
テーブルの余分な列や古いデータを削除。 - 列の設定:
tblSetting
シートに基づき、tblResult
の列見出しを設定。 - ファイルの処理: 指定されたフォルダから
xlsx
ファイルを一つずつ開き、必要なデータを抽出。 - データの転記: 抽出されたデータを
tblResult
テーブルに転記。 - ファイルのクローズ: 処理が終わったファイルを閉じて、次のファイルに進む。
このマクロの目的は、大量のExcelファイルから特定のデータを抽出し、それを一つの結果シートにまとめることです。ファイルの名前や抽出対象のセル情報が設定されていれば、効率的にデータを集約できるようになっています。
使用例
「転記」ボタンにより、マクロが実行されます。マクロが実行されると、このマクロファイルを保管しているフォルダ内の「保管先」フォルダ内のファイル(.xlsx)から、以下の左の表の「id」「抽出シート名」「抽出シート名」を参照して、右の表を作成しています。
マクロファイルのダウンロード
以下より、マクロファイルをダウンロードして、利用してください。
複数のExcelブックから特定のセルの内容を抽出
1 ファイル 26.55 KB