「ああ、またExcelが固まった……。たった 3万行のデータから重複を消して集計したいだけなのに。VLOOKUPを使いすぎて、再計算が終わらない……。もう帰りたい……」
このような経験に、身に覚えはありませんか?
私も初心者の頃、膨大な顧客リストを前に複雑なループ処理を書いてしまい、 PCがうなりを上げるのをただ眺めることしかできませんでした。 当時は「10分かかるのはデータが多いから仕方ない」と諦めていました。
でも、この「Dictionary(辞書)」を知ってからは、あんなに時間がかかっていた処理が、文字通り数秒で完了するようになりました。
Dictionary(連想配列)とは?
プログラミング用語で「連想配列」なんて言われると難しそうですが、身近なものに例えると、これは「ホテルのクローク(荷物預かり所)」です。
- 番号札(キー)を渡す。
- 荷物(値)を預ける。
- 後で番号札を見せれば、すぐに荷物が出てくる。
一般的な配列は引き出しのようなもので、 順番に中身を確認して探す必要があります 。
一方、Dictionaryはキーを指定するだけで一瞬で中身を取り出せるため、驚異的な速さを実現できます。
なぜDictionaryを使うと「速い」のか?
Excelのセルに何度もアクセスしたり、VLOOKUPを数千行に書いたりすると、PCは計算のたびに大きな負担がかかります。
Dictionaryを活用すれば、PCのメモリ内に一時的な高速データベースを構築するような形になります。そこで計算をすべて完結させてから最後にシートへ書き戻すため、処理時間を劇的に削減できるというわけです。
【実践】コピペで使える!重複を除いて集計するコード
例として、A列の商品名とB列の売上額が並ぶリストから、商品ごとの合計金額を算出してみます。
Sub FastSummary()
' Dictionaryを使うための準備
Dim myDic As Object
Set myDic = CreateObject("Scripting.Dictionary")
Dim lastRow As Long
Dim i As Long
Dim itemName As String
Dim itemPrice As Long
' A列の最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' 2行目から最終行までループ
For i = 2 To lastRow
itemName = Cells(i, 1).Value ' 商品名(キー)
itemPrice = Cells(i, 2).Value ' 売上額(値)
' もしDictionaryにまだその商品名がなければ追加
If Not myDic.Exists(itemName) Then
myDic.Add itemName, itemPrice
Else
' すでにある場合は、現在の値に加算(集計)
myDic(itemName) = myDic(itemName) + itemPrice
End If
Next i
' 最後に、結果をD列とE列に一気に書き出す
Dim k As Variant
Dim outRow As Long
outRow = 2
For Each k In myDic.Keys
Cells(outRow, 4).Value = k ' 商品名
Cells(outRow, 5).Value = myDic(k) ' 合計金額
outRow = outRow + 1
Next k
MsgBox "集計完了!"
Set myDic = Nothing ' メモリを解放
End Sub
まとめ
- Dictionaryはキーと値のセットで覚える。
- とにかく速い。セルへのアクセスを最小限にできる。
- 重複削除や集計に最強の威力を発揮する。
まずは上記のコードをコピペして、手元のデータで試してみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント