Excelで複数のブック(ファイル)にちらばった数値をまとめるマクロを紹介します。

複数のブックに集計したい数値がある場合
複数のブック、たとえば、月別のブックに集計したい数値がある場合、通常だと、ファイルを開いて、コピペを繰り返すしかありません。
非常にめんどくさいです。
12ヶ月ならまだしも、それ以上のファイルになると、それだけで1日またはそれ以上かかってしまいます。
こういった場合もマクロが便利です。
マクロの考え方
マクロは、次のようなものをつくります。
・指定したフォルダにあるExcelファイル(名前で指定することも可能)を開く
↓
・特定の数値を、集計シートに入れていく
↓
開いたファイルを閉じる
今回集計したいファイルは、次のようなものです。
セルB2に、数値(売上)が入っていて、これを、

このように集計していきます。

大事なのは、すべての集計元のブックで、セルB2に求める数値があることです。
これが、1月がセルB2、2月はセルC2、3月はセルb2・・というのでは正しく集計できません。
Excelファイルをつくるときは、同様のファイルは同様の書式でつくるようにしましょう。
今回の事例で使う基本的な構文を確認しておきます。
・ブックを開く(○○.xlsx)
Workbooks.Open Filename:=" ○○.xlsx”
・ブックを閉じる
Workbooks(○○.xlsx).Close
・シート「売上」のセルB1に、ブック「コミッション.xlsx」のセルB2を入れる
Worksheets("売上").Range("b" & n).Value = _
Workbooks(コミッション.xlsx).Worksheets("集計").Range("b2").Value
・指定したフォルダからExcelファイルを探す
次のコードで、CドライブにあるExcelファイルを探し出し、メッセージとして表示できます。
Dim Merge_book
Merge_book = Dir("c:\*.xls*")
Do Until Merge_book = ""
MsgBox (Merge_book)
Merge_book = Dir()
Loop
Merge_bookは変数です。
Merge_book = Dir(“c:\*.xls*”)
のDirは、()内のファイルを探します。
“c:\*.xls*”は、Cドライブので、「*.xls*」を探すという指定です。
Excelファイルは、.xls、.xlsx、.xlsmという拡張子(ファイル名に後ろにあるファイルの種類を示すコード)ですので、こういった指定にします。
*は、何かがそこに入るという意味です。
Do Until
Loop
は、セットで、「〜でない限り繰り返す」を意味します。
Do Until Merge_book = ""
○○○
Merge_book = Dir()
Loop
この構文で、Merge_book、つまり Dir(“c:\*.xls*”)(Cドライブの中のExcelファイル)を探し、それがなくなる(空欄””でない限り)まで、DOとLoopの間にある処理(○○○)を繰り返します。
すなわち、指定したフォルダ内のExcelファイルすべてに対して処理をおこなうのです。
処理をした後は、次のExcelファイルを探してセットする、
Merge_book = Dir()
を入れます。
複数ブックの数値を集計するマクロ
上記の基本構文を組み合わせて、マクロをつくっていきます。
フォルダを指定するマクロ
まず、「どのフォルダのExcelファイルを集計するか」を指定しておくと便利です。
マクロのコード内に書いてもいいのですが、Excelファイルに表示し、それをマクロで読み込んでいます。

とはいえ、フォルダの場所をExcelに打つのは大変です。
次のマクロを実行すると、
Sub folder() '集計したいファイルがあるフォルダを指定
If Application.FileDialog(msoFileDialogFolderPicker).Show = True Then
Range("f1").Value = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
End If
End Sub
ボックスが表示され、フォルダを指定できます。

ボタンを設定して、マクロを割り当て、「参照」という名前にすれば、より使いやすく、らしくなるのでおすすめです。

複数のブックから集計するマクロ
今回のマクロです。
Sub shuukei()
'フォルダの場所を変数に入れる
Dim Folder_path As String
Folder_path = Range("f1").Value
'集計先のシートを指定し、変数に入れる
Dim w
Set w = Worksheets("売上")
'集計するブックを変数に入れる
Dim Merge_book As String
Merge_book = Dir(Folder_path & "\*.xls*")
'いったん数値をクリア
w.Range("a1", "b" & Rows.Count).Clear
'集計先のシートの1行からスタート
Dim n
n = 1
'指定したフォルダから、Excelファイルを探す
Do Until Merge_book = ""
Workbooks.Open Filename:=Folder_path & "\" & Merge_book
'見つかったら、A列にファイル名、B列に集計値を入れる
w.Range("a" &n).Value = Merge_book
w.Range("b" &n).Value = Workbooks(Merge_book).Worksheets("集計").Range("b2").Value
'次の行へ
n = n + 1
'集計するブックを閉じる
Workbooks(Merge_book).Close
'次のファイルを探しに行く
Merge_book = Dir()
Loop
End Sub
変数は、後半のコードを読みやすくするために、設定します。
「指定したフォルダから探し出したExcelファイル」の名前を「集計するシート」のセルA1に入れる
と書かずに、
X=「指定したフォルダから探し出したExcelファイル」
Y=「集計するシート」
とし、
Xの名前をYのセルA1に入れる
と書くようなものです。
実行すると、1枚のシートに集まるので、これを集計して使うことができます。

同様の事例があったときに試してみてください。
ちなみに、今回の事例(12個のExcelファイル)をつくる際にもマクロを使っています。
フォーマットを作って、

次のマクロを書き実行しました。
Sub jirei()
Dim i
For i = 1 To 12
Worksheets.Copy
Range("b2").Value = "=RandBetween(100000, 1000000)"
Range("b2").Copy
Range("b2").PasteSpecial xlPasteValues
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\コミッション" & i & "月.xlsx"
ActiveWorkbook.Close
Next
End Sub
フォーマットを新しいブックとしてコピーして、セルB2に、100,000から1,000,000までのうちランダムで数値を入れます。
その数値を値のみコピーし、数式を消した後、「コミッション○月.xlsx」という名前で保存し閉じます。
これを1から12まで繰り返したものが事例のファイルです。
マクロは、アイデア次第でいろんなことができます。
土日の合宿後の筋肉痛が、レース後よりもひどいです。。
坂道バイクを結構やったからかもしれません。
坂道練習をもっとやらなければ・・・。
【昨日の1日1新】
※詳細は→「1日1新」
館山市民プール
富里 道の駅
びわソフトクリーム
■著書
『改訂版 税理士のためのRPA入門 ~一歩踏み出せば変えられる!業務効率化の方法~』
『税理士は「話せなくても」うまくいく ―独立がより楽しくなるコミュニケーション思考―』
『税理士のためのプログラミング -ChatGPTで知識ゼロから始める本-』
『すべてをがんばりすぎなくてもいい!顧問先の満足度を高める税理士業務の見極め方』
ひとり税理士のギモンに答える128問128答
【インボイス対応版】ひとり社長の経理の基本
「繁忙期」でもやりたいことを諦めない! 税理士のための業務効率化マニュアル
ひとり税理士の自宅仕事術
リモート経理完全マニュアル――小さな会社にお金を残す87のノウハウ
ひとり税理士のセーフティネットとリスクマネジメント
税理士のためのRPA入門~一歩踏み出せば変えられる!業務効率化の方法~
やってはいけないExcel――「やってはいけない」がわかると「Excelの正解」がわかる
AI時代のひとり税理士
新版 そのまま使える 経理&会計のためのExcel入門
フリーランスとひとり社長のための 経理をエクセルでトコトン楽にする本
新版 ひとり社長の経理の基本
『ひとり税理士の仕事術』
『フリーランスのための一生仕事に困らない本』
【監修】十人十色の「ひとり税理士」という生き方
