フォルダ内にある複数のエクセルファイルを1つのファイルにシート別にマージする
スポンサーリンク
とある仕事で大量のファイルを1つのブックにまとめる作業があったたのでマクロをつくりました。
できることとしてはこんな感じ。
マージしたいファイル群
- 一つのフォルダに複数のエクセルファイルがある
- そのファイルは「シート1」「シート2」「シート3」、、、といった形で共通のフォーマット
- 中には、歯抜けで「シート1」「シート3」となっている場合もある
- シートの中に図形など入っている(マクロ内で消す)
集約されたファイル
- エクセルファイルのシートは上と同じで「シート1」「シート2」「シート3」、、、といった形にする
- マージしたいファイルがシート毎に追記で書かれていく
マクロ
Sub marge()
Dim sFile As String
Dim sWB As Workbook, dWB As Workbook
Dim dSheetCount As Long
Const SOURCE_DIR As String = "マージ対象のファイルが入っているフォルダ"
Const DEST_FILE As String = "出力先ファイルのフルパス"
'シートの数だけ定義
Dim arrSheet(3) As String
arrSheet(1) = "シート名1"
arrSheet(2) = "シート名2"
arrSheet(3) = "シート名3"
'シートのコピーしたい最初の行番号
Dim arrStartLine(3) As Integer
arrStartLine(1) = 8
arrStartLine(2) = 13
arrStartLine(3) = 11
'ダイアログを表示させない
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'集約ファイルのオープン
Set sumWB = Workbooks.Open(Filename:=DEST_FILE)
Dim i As Integer
'エラーカウント用
errCnt = 0
'シート数分ループ
For i = 1 To 3 Step 1
SHEET_NAME = arrSheet(i)
'エラー記録ファイルのフルパス
ERROR_FILE = "C:\Data\" & SHEET_NAME & "_error.txt"
On Error Resume Next
'集約ファイルのコピー先シート名
Set sumWS = sumWB.Worksheets(SHEET_NAME)
'指定したフォルダ内にあるブックのファイル名を取得
sFile = Dir(SOURCE_DIR & "*.xlsx")
Do
'コピー元のブックを開く
Set newWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile)
'コピー元のブックのシートを指定
Set newWS = newWB.Worksheets(SHEET_NAME)
'コピー元ブックのシートの歯抜けエラーチェック
If Err.Number <> 0 Then
Open ERROR_FILE For Append As #1
Print #1, sFile & "エラー:" & Err.Number & " 説明:" & Err.Description
Close #1
errCnt = errCnt + 1
Else
'コピー元の現在処理中のファイル名を集約ファイルの該当シート内に記載
tMaxRow = sumWS.Range("A65536").End(xlUp).Row + 1
With sumWS
.Cells(tMaxRow, 1) = sFile
End With
'コピー元の現在処理中のシートの最後の行番号を取得
nMaxRow = newWS.Range("A65536").End(xlUp).Row
'コピー元の現在処理中のファイルの最後の列番号(めんどくさいから取り合ず大きい数字を指定)
nMaxCol = 20
'コピー元の現在処理中のシート内に図形が入ってるのでコピーの時に図形は対象外になるよう図形を削除
Dim shp As Shape
For Each shp In newWS.Shapes
shp.Delete
Next shp
'コピー元の現在処理中のシート内の対象データをコピー
With newWS
.Range(.Cells(arrStartLine(i), 1), .Cells(nMaxRow, nMaxCol)).Copy
End With
'集約ファイルの該当シートの最後の行+1で貼り付け先の行を指定
tMaxRow = tMaxRow + 1
'貼り付け
With sumWS
.Paste Destination:=Range(.Cells(tMaxRow, 1), .Cells(tMaxRow, 1))
End With
End If
'コピー元ファイルを閉じる
newWB.Close
'次のブックのファイル名を取得
sFile = Dir()
Loop While sFile <> ""
Next
Application.ScreenUpdating = False
If errCnt > 0 Then
MsgBox "一部のファイルでエラーが発生しました"
Else
MsgBox "終了しました"
End If
End Sub