【VBAマクロ】Dictionaryの使い方と活用例|Excel初心者向けに徹底解説

スポンサードリンク
VBA

Excel VBAで「データの重複チェック」や「検索の高速化」を行いたい場合に便利なのがDictionary(辞書型オブジェクト)です。

本記事では、VBA初心者の方にもわかりやすく、Dictionaryの基本的な使い方から、よくあるエラー対処法、実践的な活用例まで紹介します。

-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします

スポンサードリンク

Dictionaryとは?(VBAを使ったExcelマクロ)

Dictionaryとは、「キー」「値」の組み合わせでデータを管理できるオブジェクトです。
なかなかピンとこないと思います。
下図のようなものをイメージしていただけるとわかりやすいかと思います。

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など、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました