Excel VBA 閉じている複数のブックのデータを集計用のブックに集める

スポンサーリンク
スポンサーリンク

閉じている複数のブックのデータを1つのブックに集める方法

各エクセルファイルのデータ形式は同じで、A1セルから始まっていること各エクセルファイルと集計用ファイルを1つのフォルダー内におくことを前提にします。

ここでは、集計用フォルダーの中に、「集計用のブック 集計.xlsmのマクロファイル」「A店売上ブック データA.xlsxのファイル」「B店売上ブック データB.xlsxのファイル」「C店売上ブック データC.xlsxのファイル」があることを仮定してコードを記述しました。

実行すると、集計ブックに、「データA.xlsxシート」「データB.xlsxシート」「データC.xlsxシート」が追加され、各ブックのデータが転記されます。

複数ブックのデータを集計ブックに転記するコード

Sub 集計()
Dim mytable As Workbook
Dim myrange As Range
Dim mybook As Workbook
Dim mybookname As Variant
Dim mypath As String
Set mytable = Workbooks("集計Book.xlsm")
mypath = ThisWorkbook.Path & "¥"
Application.ScreenUpdating = False
For Each mybookname In Array("データA.xlsx", "データB.xlsx", "データC.xlsx")
mytable.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = mybookname
Set mybook = Workbooks.Open(mypath & mybookname)
Set myrange = mybook.Worksheets(1).Range("A1").CurrentRegion
myrange.Copy mytable.Sheets(mybookname).Range("A1")
mybook.Close
Next
Application.ScreenUpdating = True
End Sub

コードの解説

2行目【Dim mytable As Workbook】
集計用のワークブック「集計Book.xlsm」を格納する変数「mytable」をオブジェクト型(Workbook)で宣言します。


3行目【Dim myrange As Range】
各店の売上データ範囲を格納する変数「myrange」をオブジェクト型(Range)で宣言します。


4行目【Dim mybook As Workbook】
各店の売上データがあるブックを格納する変数「mybook」をオブジェクト型(Workbook)で宣言します。


5行目【Dim mybookname As Variant】
繰り返し処理の中で、各店売上データブックのブック名を格納する変数「mybookname」をバリアント型(Variant)で宣言します。


6行目【Dim mypath As String】
各店売上データブックがあるフォルダーのパス名を格納する変数「mypath」を文字列型(String)で宣言します。


7行目【Set mytable = Workbooks(“集計Book.xlsm”)】
Set【セット】キーワードを使用して変数「mytable」にオブジェクトの集計用のブック「集計Book.xlsm」を代入します。
拡張子はマクロが含まれるブックなのでXlsm(マクロ有効ブック)にしてください。


8行目【mypath = ThisWorkbook.Path & “¥”】
Application【アプリケーション】オブジェクトのThisWorkbook【ディスワークブック】プロパティを使用して、このプロシージャーが記述されているWorkbook【ワークブック】オブジェクトを参照し、Workbook【ワークブック】オブジェクトのPath【パス】プロパティを使用して、このブックのパス(場所)を取得します。文字列を連結するアンパサンド「&」でパスとブック名を区切る「¥」記号を連結した文字列を変数「mypath」に代入します。


9行目【Application.ScreenUpdating = False】
Application【アプリケーション】オブジェクトのScreenUpdating 【スクリーンアップディーティング】プロパティを使用して、次の行から始まる繰り返し処理時に画面の更新を抑制して使用メモリの削減と処理の高速化を実行します。


10行目【For Each mybookname In Array(“データA.xlsx”, “データB.xlsx”, “データC.xlsx”)】
For Each【フォーイーチ】ステートメントで繰り返し処理の始まりです。変数「mybookname」にArray【アレイ】関数を使用して、各店売上のブックを配列に格納し、繰り返し処理の中で順番に「mybookname変数」にブック名を格納します。使うときは、実際のブック名に変更してください。


11行目【mytable.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = mybookname】
このプロシージャーが記述されている集計用のブックが格納されている変数「mytable」のSheets【シーツ】プロパティで参照したSheets【シーツ】コレクションのAdd【アド】メソッドを使用して集計用ブックにワークシートを追加します。シート名はWorkSheet【ワークシート】オブジェクトのName【ネーム】プロパティで変数「mybookname」に格納されている値を使用します。


12行目【Set mybook = Workbooks.Open(mypath & mybookname)】
Workbooks【ワークブックス】コレクションのOpen【オープン】メソッドを使用して、このプロシージャーが記述されているブックと同じパス(場所)にある変数「mybookname」に格納されているブック名のブックを開いて、Set【セット】キーワードで指定したオブジェクト型変数「mybook」に代入します。


13行目【Set myrange = mybook.Worksheets(1).Range(“A1”).CurrentRegion】
開いたブックが格納されている変数「mybook」のWorksheets【ワークシーツ】プロパティで参照した最初のシートのA1セルから始まるデータ範囲をRange【レンジ】オブジェクトのCurrentRegion【カレントリージョン】プロパティで取得して、Set【セット】キーワードで指定したオブジェクト変数「myrange」に代入します。


14行目 【myrange.Copy mytable.Sheets(mybookname).Range(“A1”)】
開いているブックのデータ範囲が格納されている変数「myrange」をCopyメソッドでコピーして集計用ブックが格納されている変数「mytable」をSheets【シーツ】プロパティで参照し、引数に変数「mybookname」を指定して、そのA1セルを起点として
コピーした値を貼り付けます。


15行目【mybook.Close】
変数「mybook」に格納されている現在開いているブックをWorkbook【ワークブック】オブジェクトのClose【クローズ】メソッドを使用して閉じます。


17行目【Application.ScreenUpdating = True】
Application【アプリケーション】オブジェクトのScreenUpdating 【スクリーンアップディーティング】プロパティにTrueを設定して、抑制していた画面の更新を再開します。


これで、閉じている複数のブックのデータを集計用のブックにシート別に集めることができます。集計用ブック内でシート別にわかれているデータを集計用シートにまとめる方法はこちらをご覧ください。
ありがとうございました。

スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク