はじめに
Excelで業務データを扱う場合、
「商品別」「担当者別」などの集計処理が必要になることがよくあります。
Excel関数であれば
- SUMIF
- ピボットテーブル
などで対応できますが、VBAで自動化処理する場合は
Dictionaryを使った集計処理が非常に便利です。
さらに、データ量が多い場合は
- 配列(Array)で一括読み込み
(セルを1つずつ参照するよりExcelとのアクセス回数を減らせるため) - Dictionaryで集計
という形にすることで、
シンプルでメンテナンスしやすいコードを書くことができます。
今回は、実務でもよく使われる配列とDictionaryを組み合わせた実務的な集計方法を紹介します。
想定データ
以下のような売上データを例にします。
| 商品 | 売上 |
|---|---|
| A | 100 |
| B | 200 |
| A | 150 |
| C | 300 |
| B | 50 |
これを商品ごとに売上を集計します。
結果:
| 商品 | 合計 |
|---|---|
| A | 250 |
| B | 250 |
| C | 300 |
処理の流れ
今回の処理は次の流れになります。
Excelシート
↓
配列に一括読み込み
↓
Dictionaryで集計
↓
結果をExcelへ出力
ポイントはセルを1つずつ処理しないことです。
Dictionaryとは
Dictionaryはキー(Key)と値(Value)のペアでデータを管理するオブジェクトです。
今回の例では
商品 → 売上合計
という形で管理します。
例:
A → 250
B → 250
C → 300
実装コード
以下がサンプルコードです。
Sub SalesSummary()
'----------------------------------------
' 売上データを商品別に集計するサンプル
' Dictionary + 配列を使用
'----------------------------------------
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
' 最終行を取得
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' データを配列に読み込む
' A列:商品
' B列:売上
Dim data As Variant
data = ws.Range("A2:B" & lastRow).Value
' Dictionaryオブジェクトを作成
' Key : 商品名
' Value : 売上合計
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long
Dim product As String
Dim sales As Double
'----------------------------------------
' 配列データを1行ずつ処理
'----------------------------------------
For i = 1 To UBound(data, 1)
' 商品名
product = data(i, 1)
' 売上
sales = data(i, 2)
' すでにDictionaryに存在するか確認
If dict.Exists(product) Then
' 存在する場合:売上を加算
dict(product) = dict(product) + sales
Else
' 存在しない場合:新規追加
dict.Add product, sales
End If
Next i
'----------------------------------------
' 集計結果をExcelに出力
'----------------------------------------
Dim row As Long
row = 2
Dim key As Variant
For Each key In dict.Keys
' 商品名
ws.Cells(row, 4).Value = key
' 売上合計
ws.Cells(row, 5).Value = dict(key)
row = row + 1
Next key
End Sub
コードのポイント
① 配列でデータを読み込む
data = ws.Range("A2:B" & lastRow).Value
この処理でExcel → VBAへデータを一括読み込みします。
セルを1つずつ処理するよりもコードがシンプルになります。
② Dictionaryで集計
If dict.Exists(product) Then
意味:
この商品がすでに登録されているか?
処理:
| 状態 | 処理 |
|---|---|
| 存在する | 売上を加算 |
| 存在しない | 新規追加 |
③ 集計結果の出力
For Each key In dict.Keys
Dictionaryのキーを順番に取り出してExcelに書き込みます。
実務での活用例
Dictionaryは次のような処理でよく使われます。
売上データ集計
担当者別集計
商品マスタ検索
重複データ削除
特に
キー → 値
という形で管理できるデータと相性が良いです。
まとめ
今回のポイント:
- Dictionaryを使うと集計処理が書きやすい
- 配列と組み合わせるとコードがシンプルになる
- 実務でもよく使われる基本パターン
Excel VBAで業務自動化を行う場合、
覚えておくと便利なテクニックの1つです。
実務VBAシリーズ
- 第1回:複数Excelファイルを自動集計する方法
- 第2回:Dictionaryで売上データを集計する方法(今回)
- 第3回:100万行Excelを3秒で処理する方法(高速化完全ガイド)
- 第4回:現場で使えるVBA便利ツール5選
- 第5回:エラー処理の基本と実践|On Error完全解説