Excel VBAを掌握する:CollectionとDictionaryの「正しい選び方」でコードを劇的に洗練させる
こんにちは。VBAの海を渡り歩いてきた皆さん。
「マクロの記録」で生成されたコードを卒業し、いよいよ本格的なツール開発に挑もうとしているあなたに、一つだけ伝えておきたいことがあります。
それは、「データをどう保持し、どう取り出すか」という選択が、あなたのプログラムの命運を分けるということです。
今回は、一意なキーを持つデータ管理において避けては通れない「Collection」と「Dictionary」の使い分けについて、現場の知見を交えて徹底解説します。
—
1. なぜ「Collection」はキー重複で泣くのか?
VBAを学び始めると必ず出会うのが `Collection` です。
非常にシンプルで使いやすいのですが、キー(Key)の重複に対して非常に攻撃的です。
Dim col As New Collection
col.Add “値A”, “Key01”
col.Add “値B”, “Key01” ‘ ここで実行時エラーが発生!
この「実行時エラー」は、ループ処理中に発生するとプログラムを即座にクラッシュさせます。エラーを回避するために `On Error Resume Next` を使うのは、初心者が見せる「悪手」の代表格。エラーを握りつぶしてはいけません。
Collectionの限界
- キーの確認ができない: 「そのキーが既に存在するのか?」を確認するスマートなメソッドがない。
- 値の書き換えができない: 一度登録した値を変更するには、一度削除して追加し直す必要がある。
—
2. 救世主「Scripting.Dictionary」の真価
実務の現場で、プロのエンジニアが `Collection` よりも圧倒的に選ぶのが `Dictionary` です。これはVBA標準ではなく、Windowsの「Microsoft Scripting Runtime」というライブラリが提供する強力な道具です。
Dictionaryが最強である理由
1. `Exists` メソッド: キーが存在するかどうかを事前に確認できる。
2. 値の更新が容易: `dict(“Key”) = “新しい値”` とするだけで、存在すれば更新、なければ新規追加という挙動が可能。
3. キーの一覧取得: `Keys` プロパティでキーの一覧を配列として一気に取り出せる。
—
3. 実践:現場で使うべき「Dictionary」のコード例
現場で「データの重複チェック」や「集計」を行う際の、最も洗練されたパターンを伝授します。
Sub Dictionary活用術()
‘ 事前バインディング(ツール→参照設定で Microsoft Scripting Runtime を有効にすると高速)
Dim dict As Object
Set dict = CreateObject(“Scripting.Dictionary”)
Dim dataList As Variant
dataList = Array(“Apple”, “Orange”, “Apple”, “Banana”)
Dim item As Variant
For Each item In dataList
‘ キーが存在するか判定してから処理を分けるのがプロの流儀
If Not dict.Exists(item) Then
dict.Add item, 1 ‘ 初回登場:カウント1
Else
dict(item) = dict(item) + 1 ‘ 2回目以降:インクリメント
End If
Next
‘ 結果の出力
Dim key As Variant
For Each key In dict.Keys
Debug.Print key & ” は ” & dict(key) & ” 個あります。”
Next
End Sub
—
4. 結局、どちらを使うべきか?(賢い使い分け)
ここが今回の核心です。迷ったら以下の基準で選んでください。
| 比較項目 | Collection | Dictionary |
| :— | :— | :— |
| 主な用途 | 純粋なリスト管理 | キーと値のペア管理・集計・高速検索 |
| 存在確認 | できない(エラーが出る) | `Exists` で安全に確認できる |
| 値の更新 | 不可(削除→追加が必要) | 直接代入で更新可能 |
| 推奨度 | 低(小規模なリスト向け) | 高(実務の9割はこれ) |
先輩エンジニアからのアドバイス
- 「順序」が命なら `Collection`: `Collection` は要素を追加した順番を保持し、インデックス番号でのアクセスが非常に直感的です。
- 「検索・集計・更新」が命なら `Dictionary`: 業務のほとんどは「データの突き合わせ」です。この場合、`Dictionary` 一択です。
—
最後に:なぜ「エラー」を回避するのか
皆さんが書くコードは、あなた一人が使うものではありません。あるいは、未来のあなたがメンテナンスするコードです。
「エラーが出ないように組む」ことは、単にプログラムを動かすことではありません。「想定外の入力に対しても、プログラムが静かに、かつ確実に振る舞うこと」こそが、プログラミングにおける品格です。
`Dictionary` を使いこなせるようになれば、あなたのVBAライフは劇的に変わります。コードの行数は減り、実行速度は上がり、何より「エラーに怯える時間」がなくなります。
ここをクリアすれば、あなたはもう脱・初心者です。次回のステップアップも楽しみにしていますよ。頑張ってください!
