Excel VBAで「検索」に悩むのは今日で卒業!CollectionとDictionaryの真実
こんにちは。業務自動化の世界へようこそ。
日々、Excelと格闘する中で「数万行のデータから特定のIDを探し出すのに、ループを回して何秒も待たされている……」なんて経験はありませんか?
もし、あなたが`For`ループの中に`If`文を書いて、全行をスキャンするようなコードを書いているなら、それは「歩いて日本一周している」ようなものです。
今日は、Excel VBAを「ただ動くコード」から「一瞬で仕事を終わらせる兵器」へ進化させるための、最も重要な武器、`Scripting.Dictionary`についてお話しします。
—
1. なぜ「Dictionary」が最強なのか?
VBAには標準で用意されているデータ格納庫として`Collection`がありますが、実はもっと強力な`Dictionary`(辞書)という存在があります。
この二つの決定的な違いを、本質的な視点で解説します。
- Collection(整理箱): 順番に並べて入れるのは得意。しかし、「中身を検索する」機能が極めて貧弱。
- Dictionary(索引付き辞書): 「キー(Key)」と「値(Item)」のペアで管理する。検索の際、中身を一つずつ探す必要がない。
なぜ速いのか?(ここが重要)
Dictionaryは「ハッシュテーブル」という仕組みを使っています。本で例えるなら、「目次からページを特定する」のと同等の処理速度です。データが100万件あっても、検索速度はほぼ変わりません。これが、業務自動化において「爆速」を実現するエンジニアの常識です。
—
2. 現場で使える「Dictionary」の書き方
まずは、基本の型を覚えましょう。これさえあれば、ほとんどの検索処理は解決します。
Sub Dictionaryの基本()
‘ 1. オブジェクトの生成
‘ ※事前に「Microsoft Scripting Runtime」を参照設定するとIntelliSenseが効いて便利です
Dim dict As Object
Set dict = CreateObject(“Scripting.Dictionary”)
‘ 2. データの追加 (キー, 値)
dict.Add “A001”, “佐藤”
dict.Add “A002”, “鈴木”
‘ 3. キーが存在するか確認(これが超重要!)
If dict.Exists(“A001”) Then
Debug.Print “見つかりました: ” & dict(“A001”)
End If
‘ 4. 値の書き換え
dict(“A001”) = “佐藤(更新)”
‘ 5. メモリ解放(おまじない)
Set dict = Nothing
End Sub
—
3. 「マクロの記録」から脱却する実践テクニック
例えば、「売上データリストから、特定の社員の合計金額を抽出したい」という時、素人は`Range`を何度も見に行きますが、プロはこうします。
Sub データ集計の極意()
Dim dict As Object
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim key As Variant, val As Variant
Set dict = CreateObject(“Scripting.Dictionary”)
Set ws = ThisWorkbook.Sheets(“売上データ”)
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
‘ 一気にメモリ(Dictionary)にロードする
For i = 2 To lastRow
key = ws.Cells(i, 1).Value ‘ 社員ID
val = ws.Cells(i, 2).Value ‘ 売上金額
If Not dict.Exists(key) Then
dict.Add key, val
Else
‘ 既にあれば加算する
dict(key) = dict(key) + val
End If
Next i
‘ 結果を出力(Dictionaryの中身をループで回す)
i = 2
For Each key In dict.Keys
ws.Cells(i, 4).Value = key
ws.Cells(i, 5).Value = dict(key)
i = i + 1
Next key
End Sub
このコードのポイント
1. セルへのアクセスは最小限に: セルを読み書きする回数は処理時間を激増させます。Dictionaryを使えば、セルからメモリに一度読み込んでしまえば、あとはメモリ上で超高速に処理できます。
2. `Exists`による安全策: これを忘れると、「すでに同じキーがあります」というエラーでプログラムが停止します。常に「あるか?」を確認する癖をつけてください。
—
4. 陥りやすい罠:大文字と小文字
Dictionaryは、デフォルトで「大文字・小文字を区別しない」設定になっています。
例えば、`dict.Add “ABC”, 1` とした後に `dict.Exists(“abc”)` を実行すると、`True`が返ってきます。
もし厳密に区別したい場合は、`dict.CompareMode = BinaryCompare` を設定してください。これを知っているだけで、不具合調査の時間を大幅に削減できます。
—
最後に:エンジニアとして成長するために
「Dictionary」を使いこなせると、Excel VBAの景色はガラッと変わります。これまで「時間がかかるから……」と諦めていた大量データの処理が、コーヒーを淹れている間に終わるようになります。
まずは、小さなデータセットで構いません。今日紹介したコードを、ご自身の業務の「検索処理」に置き換えてみてください。
ここをクリアすれば、あなたはもう「マクロの記録」に頼るだけの初心者ではありません。
一歩ずつ、自動化の達人を目指していきましょう。応援しています!
