Excel VBAで「データの重複チェック」や「検索の高速化」を行いたい場合に便利なのがDictionary(辞書型オブジェクト)です。
本記事では、VBA初心者の方にもわかりやすく、Dictionaryの基本的な使い方から、よくあるエラー対処法、実践的な活用例まで紹介します。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
Dictionaryとは?(VBAを使ったExcelマクロ)
Dictionaryとは、「キー」と「値」の組み合わせでデータを管理できるオブジェクトです。
なかなかピンとこないと思います。
下図のようなものをイメージしていただけるとわかりやすいかと思います。

キーである「A001」を検索することで、すばやく「寿司」という値にアクセスすることができます。
では「Dictionary」の書き方・使い方を見ていきましょう。
【Dictionaryを使うメリット】
- 高速な検索:何万件でも一瞬で検索可能
- キーの重複を防げる:同じキーは2回登録できない
- コードがスッキリする:複雑な条件分岐が不要になる
Dictionaryの使い方
まずは簡単な使い方をお見せします。
簡単な使い方
下記がVBAコードです。
Sub 簡単なDictionary()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
Debug.Print dict("A001") ' → 寿司
End Sub
少し長いように見えますが、1つ1つ解説していきます。
プロシージャの作成
Sub 簡単なDictionary()
End Sub
プロシージャなど、マクロの基礎は下記記事でわかりやすく解説しております。
コードだけではなく、開発タブの表示からマクロの保存まで知りたい方はご参考ください。
変数の宣言
Dim dict As Object
上記コードにて、以降使用する変数の宣言を行っております。
変数や宣言についての詳しい解説は、下記記事をご参考ください。
辞書を作成
Set dict = CreateObject("Scripting.Dictionary")
上記コードにて、辞書を作成しています。
まず「set」を書いたら、2行目で宣言した変数「dict」を書きます。
そして「=(イコール)」を書いたら、「CreateObject(“Scripting.Dictionary”)」を書いて完了です。
これで変数「dict」は辞書型となり、「キー」と「値」で管理できるようになります。
Setの必要性については下記記事をご参考ください。
では、この辞書にデータを追加してみましょう。
辞書にデータを追加
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
上記コードにて、辞書にデータを追加しています。
辞書「dict」を書いたら、「.Add」を書きます。
「Add」は辞書にデータを追加するメソッドです。
メソッドとは、特定のオブジェクト(セルやシートなど)に対して実行できる機能で、
「オブジェクト名.メソッド名」というコードで記述します。
「dict.Add」と記述することで、Addメソッドをdict(辞書)に対して実行したということになります。
「Add」の後ろには、「キー」と「値」を書きます。
それぞれを「”(ダブルクォーテーション)」で囲い、「,(カンマ)」で区切ってください。
【 辞書.Add “キー“, “値“ 】
値を表示
Debug.Print dict("A001") ' → 寿司
最後に「Debag.Print」で値を表示させています。
キーを指定することで、値を表示させることができます。

「Debag.Print」の表示方法については下記記事をご参考ください。
マクロが完成したら、実行して動作を確認してみましょう。

エクセル内に作成した自作のボタンを押してマクロを実行させることも可能です。
ボタンの作り方は、下記記事でわかりやすく解説しております。
ショートカットキーを押すことでマクロを実行させることもできます。
詳しくは下記記事をご参考ください。
少し高度な使い方
Dictionaryにはさまざまなメソッドがあります。
今回はよく使う以下のメソッドの使い方を紹介いたします。
【よく使うメソッド】
- .Add:要素の追加
- .Exists(key):キーの存在確認
- .Item(key):値の取得・設定
- .Remove(key):要素の削除
- .Count:要素数を取得
- .Keys / .Items:キーと値の一覧取得
キーの存在を確認
「Exists()」を使うことで、特定のキーが存在するかを確認することができます。
下記VBAコードの9行目に注目してください。
Sub キーの存在を確認()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
If dict.Exists("A001") Then ' キーの存在を確認
Debug.Print "そのキーは存在します"
Else
Debug.Print "そのキーは存在しません"
End If
End Sub
キーが存在する場合としない場合とで表示を変えています。
条件で分岐させることができるIfについては、下記記事で使い方を解説しております。
値の取得・設定
「Item()」を使うことで、キーに対応する値を取得したり、新しい値を設定したりします。
下記VBAコードの10行目に注目してください。
Sub 値の取得()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim atai As String
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
atai = dict.Item("A001") ' → "寿司"
Debug.Print atai ' → "寿司"
End Sub
「dict.Item(“A001”)」でキー(A001)に対応した値を取得し、変数に格納しています。
(12行目でその変数の値を表示)
※「.Item」を省略して「dict(“A001”)」としても同じ結果が得られます。
プログラムの途中で値を変更することもできます。
Sub 値の変更()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
dict.Item("A001") = "にぎり寿司" ' 値を変更
Debug.Print dict("A001") ' → にぎり寿司
End Sub
要素の削除
「Remove」を使うことで、要素(キーと値)を削除することができます。
下記VBAコードの10行目に注目してください。
Sub 要素の削除()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim atai As String
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
dict.Remove "A001" ' A001を削除
If dict.Exists("A001") Then
Debug.Print "そのキーは存在します"
Else
Debug.Print "そのキーは存在しません"
End If
End Sub
キー「A001」を削除したため、12行目の分岐では「そのキーは存在しません」と表示されます。
※存在しないキーを削除しようとするとエラーになりますのでご注意ください。
要素数を取得
「Count」を使用することで、要素数を取得することができます。
下記VBAコードの9に注目してください。
Sub 要素数を取得()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
Debug.Print dict.Count ' 要素数を表示(3)
End Sub
これで要素数が表示されます。
キーや値の一覧取得
全てのキーや値を一覧で表示したい場合は、「.Keys」や「.Items」を使います。
下記VBAコードの10行目に注目です。
Sub キーの一覧を取得()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim key As Variant
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
For Each key In dict.Keys ' 1つのキーを変数に代入
Debug.Print key ' 「変数に入ったキーを表示」を繰り返す
Next
End Sub

「.keys」により、キー一覧が表示されました。
下記は値一覧を表示した例です。
Sub 値の一覧を取得()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim atai As Variant
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
For Each atai In dict.Items ' 1つの値を変数に代入
Debug.Print atai ' 「変数に入った値を表示」を繰り返す
Next
End Sub

キーと値をセットで表示することもできます。
Sub キーと値をセットで表示()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim keys As Variant
Dim i As Long
dict.Add "A001", "寿司"
dict.Add "A002", "天ぷら"
dict.Add "A003", "ラーメン"
keys = dict.Keys
For i = LBound(keys) To UBound(keys)
Debug.Print keys(i) & ":" & dict(keys(i))
Next
End Sub

実践的な活用例
ここからは、より実践的な活用例を2つ紹介いたします。
重複データのチェック
重複のないIDをリスト化したい時に便利な方法です。
Sub 重複データのチェック()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long
For i = 2 To 5
Dim id As String
id = Cells(i, 1).Value
If Not dict.Exists(id) Then
dict.Add id, True
Else
Cells(i, 3).Value = "重複"
End If
Next i
End Sub

データの分類と集計
商品ごとの売上を集計する例です。
Sub SumByProduct()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long
For i = 2 To 100
Dim product As String
Dim amount As Double
product = Cells(i, 1).Value
amount = Cells(i, 2).Value
If dict.Exists(product) Then
dict(product) = dict(product) + amount
Else
dict.Add product, amount
End If
Next i
' 結果出力
Dim key As Variant
i = 2
For Each key In dict.Keys
Cells(i, 4).Value = key
Cells(i, 5).Value = dict(key)
i = i + 1
Next key
End Sub

A~B列が元データです。
集計データがD~E列に書き込みされます。
うまく動作しないときの対処法
エラーが発生する
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
今回の場合は、重複するキーを登録しようとした場合もエラーが発生します。
コードを再度確認してみてください。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBAのDictionaryを使ったExcelマクロを解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!