【VBAリファレンス】Excel VBAで実現!実績/予算ごとの3年間通算累計を自動出力する実践テクニック

スポンサーリンク

はじめに

Excelでのデータ集計、特に年をまたいだ累計値の算出は、多くのビジネスシーンで求められる重要な作業です。しかし、手作業で行うとミスが発生しやすく、時間もかかります。本記事では、Excel VBAを活用して「実績/予算ごとの3年間通算累計」を自動で出力する方法を、初心者の方でも理解できるよう丁寧に解説します。このテクニックを習得すれば、集計作業の効率が劇的に向上し、より戦略的な分析に時間を割くことができるようになるでしょう。

3年間通算累計とは?

「3年間通算累計」とは、特定の期間(ここでは3年間)における「実績」と「予算」の合計値を指します。例えば、ある商品や部門の売上実績や目標予算を、過去3年分積み上げて把握することで、長期的なトレンドや達成度をより正確に評価できます。

例えば、以下のようなデータがあるとします。

| 年 | 月 | 実績 | 予算 |
|——|——|——|——|
| 2021 | 1 | 100 | 120 |
| 2021 | 2 | 150 | 130 |
| … | … | … | … |
| 2022 | 1 | 120 | 130 |
| 2022 | 2 | 160 | 140 |
| … | … | … | … |
| 2023 | 1 | 130 | 140 |
| 2023 | 2 | 170 | 150 |
| … | … | … | … |

このデータに対して、各年ごとの累計だけでなく、3年間を通した累計を「実績」と「予算」それぞれで算出したい、というのが今回のテーマです。

VBAで自動化するメリット

Excel VBAを使用してこの累計値を自動化するメリットは計り知れません。

* **時間短縮:** 手作業で数式をコピーしたり、データを集計したりする手間がなくなります。
* **ヒューマンエラーの削減:** 数式の間違いやコピー漏れといった人的ミスを防ぎ、正確な結果を得られます。
* **作業の標準化:** 誰が実行しても同じ結果が得られるため、チーム内での作業のばらつきがなくなります。
* **柔軟な分析:** データが更新された際も、マクロを実行するだけで最新の累計値が得られます。

具体的な実装方法(サンプルコードと解説)

ここでは、VBAを使用して3年間通算累計を算出する具体的な方法を解説します。

前提とするシート構成

説明を分かりやすくするため、以下のようなシート構成を想定します。

* **シート名:** `売上データ`
* **A列:** 年 (例: 2021)
* **B列:** 月 (例: 1)
* **C列:** 実績 (数値)
* **D列:** 予算 (数値)

そして、集計結果を表示するシートとして、別のシート(例えば`集計結果`シート)を用意し、そこに結果を出力します。

* **シート名:** `集計結果`
* **A1セル:** “通算累計”
* **B1セル:** “実績合計”
* **C1セル:** “予算合計”

VBAコードの作成

VBAエディタを開き(Alt + F11)、標準モジュールを挿入して、以下のコードを記述します。

Sub Calculate3YearTotalAccumulation()

Dim wsData As Worksheet
Dim wsSummary As Worksheet
Dim lastRow As Long
Dim totalActuals As Double
Dim totalBudgets As Double
Dim currentRow As Long

‘ —- 初期設定 —-
‘ データシートを設定
On Error Resume Next ‘ シートが存在しない場合のエラーを無視
Set wsData = ThisWorkbook.Sheets(“売上データ”)
If wsData Is Nothing Then
MsgBox “「売上データ」シートが見つかりません。シート名を確認してください。”, vbExclamation
Exit Sub
End If
On Error GoTo 0 ‘ エラーハンドリングを元に戻す

‘ 集計結果シートを設定
On Error Resume Next
Set wsSummary = ThisWorkbook.Sheets(“集計結果”)
If wsSummary Is Nothing Then
MsgBox “「集計結果」シートが見つかりません。シート名を確認してください。”, vbExclamation
Exit Sub
End If
On Error GoTo 0

‘ —- データ範囲の取得 —-
‘ データシートの最終行を取得 (A列を基準)
lastRow = wsData.Cells(Rows.Count, “A”).End(xlUp).Row

‘ データがない場合は処理を終了
If lastRow < 2 Then ' ヘッダー行を除いてデータがない場合 MsgBox "「売上データ」シートに集計対象のデータがありません。", vbInformation Exit Sub End If ' ---- 集計値の初期化 ---- totalActuals = 0 totalBudgets = 0 ' ---- 3年間の累計を計算 ---- ' 2行目から最終行までループ (ヘッダー行を除く) For currentRow = 2 To lastRow ' 実績の合計を計算 ' エラー値や空白セルを考慮して数値に変換 If IsNumeric(wsData.Cells(currentRow, "C").Value) And wsData.Cells(currentRow, "C").Value <> “” Then
totalActuals = totalActuals + CDbl(wsData.Cells(currentRow, “C”).Value)
End If

‘ 予算の合計を計算
If IsNumeric(wsData.Cells(currentRow, “D”).Value) And wsData.Cells(currentRow, “D”).Value <> “” Then
totalBudgets = totalBudgets + CDbl(wsData.Cells(currentRow, “D”).Value)
End If
Next currentRow

‘ —- 集計結果シートに出力 —-
‘ 出力セルに値を書き込む
wsSummary.Range(“B2”).Value = totalActuals ‘ 実績合計
wsSummary.Range(“C2”).Value = totalBudgets ‘ 予算合計

MsgBox “3年間の通算累計計算が完了しました。”, vbInformation

End Sub

コードの解説

1. **変数宣言:**
* `wsData`, `wsSummary`: それぞれデータシートと集計結果シートを表すWorksheetオブジェクトです。
* `lastRow`: データシートの最終行番号を格納します。
* `totalActuals`, `totalBudgets`: それぞれ実績と予算の合計値を格納するDouble型の変数です。
* `currentRow`: ループ処理で使用する現在の行番号を格納します。

2. **シート設定:**
* `Set wsData = ThisWorkbook.Sheets(“売上データ”)`: `売上データ`という名前のシートを`wsData`変数に代入します。
* `Set wsSummary = ThisWorkbook.Sheets(“集計結果”)`: `集計結果`という名前のシートを`wsSummary`変数に代入します。
* `On Error Resume Next`と`On Error GoTo 0`: シートが存在しない場合のエラーを捕捉し、ユーザーに分かりやすいメッセージを表示するためのエラーハンドリングです。

3. **データ範囲の取得:**
* `lastRow = wsData.Cells(Rows.Count, “A”).End(xlUp).Row`: A列の最終データが入っている行番号を取得します。これにより、データ量が増減しても柔軟に対応できます。
* `If lastRow < 2 Then ... Exit Sub`: ヘッダー行(1行目)以外にデータがない場合、処理を中断します。 4. **集計値の初期化:** * `totalActuals = 0` * `totalBudgets = 0`: 計算を開始する前に、累計値を0にリセットします。 5. **3年間の累計計算:** * `For currentRow = 2 To lastRow ... Next currentRow`: 2行目から最終行まで、1行ずつ処理を繰り返します。 * `If IsNumeric(...) And ... <> “” Then …`: セルに数値が入っており、かつ空白でないかを確認しています。これにより、数値以外のデータや空白セルが含まれていてもエラーにならず、意図しない計算を防ぎます。
* `totalActuals = totalActuals + CDbl(wsData.Cells(currentRow, “C”).Value)`: 現在の行の実績値(C列)を`totalActuals`に加算します。`CDbl`関数でDouble型に変換することで、大きな数値や小数点以下の値にも対応できるようにしています。
* `totalBudgets = totalBudgets + CDbl(wsData.Cells(currentRow, “D”).Value)`: 同様に、現在の行の予算値(D列)を`totalBudgets`に加算します。

6. **集計結果シートへの出力:**
* `wsSummary.Range(“B2”).Value = totalActuals`: 計算された実績合計値を`集計結果`シートのB2セルに出力します。
* `wsSummary.Range(“C2”).Value = totalBudgets`: 計算された予算合計値を`集計結果`シートのC2セルに出力します。
* `MsgBox …`: 処理が完了したことをユーザーに通知します。

マクロの実行方法

1. VBAエディタで作成したマクロを選択し、[実行]ボタン(▶)をクリックするか、F5キーを押します。
2. または、Excelシートに戻り、[開発]タブ → [マクロ] → `Calculate3YearTotalAccumulation`を選択して[実行]をクリックします。
* [開発]タブが表示されていない場合は、[ファイル] → [オプション] → [リボンのユーザー設定]で「開発」にチェックを入れてください。
3. マクロを実行すると、`集計結果`シートのB2セルとC2セルに3年間の通算累計値が出力されます。

実務で役立つアドバイス

* **エラーハンドリングの強化:**
* 今回のコードでは基本的なエラーハンドリングのみですが、実際には「年」や「月」のデータ形式がおかしい場合、あるいは「実績」「予算」列に文字列が大量に含まれている場合など、より詳細なエラーチェックが必要になることがあります。`On Error GoTo ErrorHandler`などを利用して、エラー発生時の処理を分岐させることも検討しましょう。
* **シート名・セル番地の柔軟性:**
* シート名や出力先のセル番地が固定されていると、後々の変更に対応しにくくなります。可能であれば、シート名やセル番地を直接コードに書き込まず、別のシートに設定しておき、その設定値を読み込むようにすると、より汎用性の高いマクロになります。
* **集計対象期間の指定:**
* 今回のコードは全データを対象としていますが、特定の3年間(例: 2021年~2023年)のみを対象としたい場合は、ループ内で年をチェックする条件分岐を追加する必要があります。

‘ 例: 2021年~2023年のデータのみを対象とする場合
For currentRow = 2 To lastRow
Dim targetYear As Integer
If IsNumeric(wsData.Cells(currentRow, “A”).Value) Then
targetYear = CInt(wsData.Cells(currentRow, “A”).Value)
If targetYear >= 2021 And targetYear <= 2023 Then ' 実績・予算の加算処理をここで行う If IsNumeric(wsData.Cells(currentRow, "C").Value) And wsData.Cells(currentRow, "C").Value <> “” Then
totalActuals = totalActuals + CDbl(wsData.Cells(currentRow, “C”).Value)
End If
If IsNumeric(wsData.Cells(currentRow, “D”).Value) And wsData.Cells(currentRow, “D”).Value <> “” Then
totalBudgets = totalBudgets + CDbl(wsData.Cells(currentRow, “D”).Value)
End If
End If
End If
Next currentRow

* **パフォーマンスの考慮:**
* データ量が膨大(数万行以上)になる場合、セルを1行ずつ参照するループ処理はパフォーマンスが低下する可能性があります。その場合は、`Application.ScreenUpdating = False`で画面更新を停止したり、配列変数にデータを読み込んでから処理するなどの高速化テクニックを検討すると良いでしょう。
* **集計結果の可視化:**
* 累計値だけでなく、グラフなどで可視化すると、より直感的に状況を把握できます。VBAでグラフを作成することも可能です。
* **定期実行:**
* もし毎月や毎週など、定期的にこの集計を行う必要がある場合は、WindowsのタスクスケジューラとExcelのマクロを連携させて自動実行させることもできます。

まとめ

本記事では、Excel VBAを用いて「実績/予算ごとの3年間通算累計」を自動出力する方法について、具体的なサンプルコードと解説を交えてご紹介しました。この自動化により、集計作業にかかる時間と労力を大幅に削減し、より付加価値の高い業務に集中できるようになります。

今回ご紹介したコードは基本的なものですが、これをベースに、ご自身の業務に合わせてカスタマイズしていくことで、さらに強力な集計ツールとして活用できるはずです。ぜひ、この機会にExcel VBAの学習を進め、日々の業務効率化に役立ててください。データ分析の精度向上と、よりスマートな働き方の実現を応援しています。

タイトルとURLをコピーしました