Excel VBAで月末集計を自動化!5分の作業を3秒に短縮する基本の型
毎月末、大量のシートからデータを集計する作業に追われていませんか?「またこの単純作業か…」とため息をついているなら、VBA(ブイビーエー)による自動化が解決策です。この記事を読めば、ボタン一つで集計が完了する「魔法の仕組み」の作り方が分かります。
なぜ手作業の集計は「悪」なのか?
初心者
プロさん、助けてください!毎月、各支店の売上報告書(Excelファイル)を開いて、集計シートにコピペするだけで半日潰れちゃうんです…。うっかりミスも多くて…うぅ…。
プロ
ほう、それは心の修行ですな。しかし、その苦しみはVBAが解き放ってくれますぞ。VBAとは、Excelの操作を自動化するためのプログラム言語。人が行う「繰り返し作業」を、機械の速さと正確さで代行させるのです。
初心者
プログラム言語!?なんだか難しそうですね…。僕みたいな初心者でも扱えるんでしょうか?
プロ
案ずることはありません。まずは「マクロの記録」という機能で自分の操作をVBAコードに翻訳させ、それを少し書き換えることから始めればよいのです。今回はその第一歩、基本の型を授けましょう。
5ステップで完成!支店別売上集計マクロ
ここでは、「東京支店」「大阪支店」という2つのシートから、「全社集計」シートへデータをまとめるマクロを作成します。
- VBAエディタを開き、標準モジュールを挿入する。
- 集計先シート(全社集計)を一度クリアにするコードを書く。
- 集計元シート(東京支店、大阪支店)を順番に処理するコードを書く。
- 各シートの最終行までデータをループで取得し、集計先シートへ転記する。
- シートにボタンを設置し、作成したマクロを登録する。
完成コード例:
以下のコードを標準モジュールに貼り付けて使ってみましょう。
Sub MonthlySummary()
' --- 変数の宣言 ---
Dim wsSummary As Worksheet ' 集計先シート
Dim wsData As Worksheet ' 集計元シート
Dim lastRowSummary As Long ' 集計先シートの最終行
Dim lastRowData As Long ' 集計元シートの最終行
Dim i As Long
' --- 初期設定 ---
' 画面の更新を停止して高速化
Application.ScreenUpdating = False
' 集計先シートを設定
Set wsSummary = ThisWorkbook.Worksheets("全社集計")
' 集計先シートの既存データをクリア(A2以降)
wsSummary.Range("A2:D" & wsSummary.Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
' --- 各シートからデータを転記 ---
For Each wsData In ThisWorkbook.Worksheets
' シート名が"支店"で終わるものだけを対象にする
If wsData.Name Like "*支店" Then
' 集計元シートの最終行を取得
lastRowData = wsData.Cells(Rows.Count, 1).End(xlUp).Row
' データがある場合のみ処理(見出し行を除く)
If lastRowData > 1 Then
' 集計先シートの書き込み開始行を取得
lastRowSummary = wsSummary.Cells(Rows.Count, 1).End(xlUp).Row + 1
' データをコピーして貼り付け
wsData.Range("A2:D" & lastRowData).Copy wsSummary.Cells(lastRowSummary, 1)
End If
End If
Next wsData
' --- 終了処理 ---
' 画面の更新を再開
Application.ScreenUpdating = True
' 完了メッセージ
MsgBox "集計が完了しました。"
End Sub
実務サンプル:支店別売上を1枚に集約
このマクロは、以下のような構成のブックで動作します。「東京支店」「大阪支店」シートのデータを「全社集計」シートにまとめます。
【集計元】東京支店シート
| 日付 | 担当者 | 商品名 | 売上 |
|---|---|---|---|
| 2023/10/01 | 佐藤 | 商品A | 10000 |
| 2023/10/02 | 鈴木 | 商品B | 15000 |
【集計元】大阪支店シート
| 日付 | 担当者 | 商品名 | 売上 |
|---|---|---|---|
| 2023/10/01 | 田中 | 商品C | 20000 |
| 2023/10/03 | 高橋 | 商品A | 12000 |
【マクロ実行後の結果】全社集計シート
| 日付 | 担当者 | 商品名 | 売上 |
|---|---|---|---|
| 2023/10/01 | 佐藤 | 商品A | 10000 |
| 2023/10/02 | 鈴木 | 商品B | 15000 |
| 2023/10/01 | 田中 | 商品C | 20000 |
| 2023/10/03 | 高橋 | 商品A | 12000 |
初心者がハマる「落とし穴」とその乗り越え方
VBAを使い始めた頃によく遭遇するエラーとその対策をまとめました。慌てず対処すれば大丈夫です。
| 原因(現象) | 対処法 | 一言メモ |
|---|---|---|
| シート名を変更したら動かなくなった(エラー9: インデックスが有効範囲にありません) | Worksheets("シート名")の指定を、変更に強いSheet1のような「コード名」での指定に変える。 |
コード名はVBAエディタのプロパティウィンドウで確認・変更できます。 |
| 実行ボタンを押すたびにデータが二重、三重に追記されてしまう。 | マクロの最初に、集計先シートのデータをクリアする処理(wsSummary.Cells.ClearContentsなど)を入れる。 |
見出し行まで消さないようにRange("A2:D" & lastRow).ClearContentsのように範囲指定するのが確実です。 |
| データ量が多いと処理が遅く、Excelが固まったように見える。 | コードの冒頭にApplication.ScreenUpdating = Falseを、末尾に= Trueを追加する。 |
処理中の画面描画をオフにするだけで、体感速度が劇的に向上します。 |
| 途中に空行があると、そこまでしかデータがコピーされない。 | 最終行の取得方法をEnd(xlUp)から、A列など必ずデータが入る列を基準に取得するように見直す。 |
lastRow = wsData.Cells(Rows.Count, "A").End(xlUp).Rowのように列を指定すると安定します。 |
まとめ:VBAで単純作業から解放されよう
今回学んだことを活かせば、あなたの業務は大きく変わるはずです。
- 定型作業はVBAの得意分野: 毎月同じ手順の作業こそ、VBAで自動化する価値が最も高いです。
- コードは「型」を覚える: 転記や集計には基本の型があります。今回のコードを基に、シート名や範囲を書き換えるだけで応用できます。
- 小さな成功体験を積む: 最初から完璧なマクロを目指す必要はありません。まずは1つの作業を自動化することから始めましょう。
さあ、まずはあなたの業務の中で最も時間を奪っている単純作業を一つ思い浮かべ、それを自動化する第一歩を踏み出しましょう。



コメント