辞書

中級VBA

辞書(連想配列)の使い方

辞書は、連想配列とも呼ばれ、配列やコレクションに似ています。

辞書は、キーを持つ配列のようなものです。
動的配列のように、後から追加していくことができます。
ただし、キーは重複してはいけません。このことを利用して重複のないリストを作ることもできます。

宣言のしかた

辞書の宣言方法は2つあります。CreateObjectで宣言する方法参照による宣言方法です。

CreateObjectで宣言する方法

Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")

参照で宣言する方法

Dim dic As New Dictionary

 参照で宣言する場合は、VBEの「ツール」「参照設定」から、「Microsoft Scripting Runtime」にチェックをいれてください。

※以降、Dictionary(辞書)オブジェクトを dic でインスタンス化したものとして扱います。

要素の追加( キーと 値)

辞書に要素を追加するには、Addメソッドを使用します。

dic.Add "社員番号", 100
dic.Add "氏名", "山田太郎"
dic.Add "性別", "男"
dic.Add "年齢", 30

このように、 dic.Add キー,  とセットします。

尚、辞書ではキーが重複してはいけません。
そのため、既に登録されていないか確かめるExistsメソッドが用意されています。

    If dic.Exists("社員番号") Then    'キー存在するか確認
        dic.Add "社員番号", 100
    Else
        MsgBox "社員番号は既に割り当てられています。"
    End If

値の参照

辞書はキーから値を得るのが得意で、高速で動作します。
キーから値を得たいときは、以下のようにします。

値 = dic(キー)

値をすべて参照する際は、For Each がよく使われます。
例を示します。

    Dim val As Variant
    For Each val In dic.keys
    
        Debug.Print val & ":" & dic(val)
    
    Next

dic.keys でキーのリストが For Each に渡され、バリアント型の val で受けています。
結果は以下のようになります。

社員番号:101
氏名:山田太郎
性別:男
年齢:30

値・キーの変更

値を変更するときは、辞書にキーを指定して代入します。

dic(キー) = 値

dic(“社員番号”) = 101

キーを変更したいときは、以下のようにします。

dic.Key(古いキー) = 新しいキー

dic.Key(“年齢”) = “age”

要素数(カウント)

辞書の要素数はCountメソッドを使います。

要素数 = dic.Count

要素の削除

Removeメソッドでキーを指定して要素を削除できます。
この時、キーと値の両方が削除されます。

dic.Remove (キー)

初期化

 RemoveAll メソッドで値を全て削除することで、辞書を初期化することができます。
 Remove メソッドのようにキーを指定することはなく、一度に全ての値を削除できて便利です。
 実際のプログラムでは、初回に呼び出して明示的に初期化することも良くあります。

dic.RemoveAll

重複しないリスト

これまでの知識を使って重複しないリストを作りながら集計を行うプログラムを書いてみます。

動作としては、まずA列の値を辞書に登録していきますが、
その前に existsメソッドで既にキーが登録されていないか確かめます。
既に登録されている場合はTrueが返るので、その時は前回の値と今回の値を足します。
もし、登録されていない場合は、新たに登録します。

最後に For Each でキーと値を取りだしながら別のセルに結果を表示しています。

Sub dicTest()
    Dim i As Long
    Dim myKey As String
    Dim myDic As Object
    Set myDic = CreateObject("Scripting.Dictionary")

    For i = 2 To 8
        myKey = Cells(i, "A")
        
        If myDic.exists(myKey) Then     'キーが既にあればTrue
            
            'キーが既に登録されている時は値を足す
            myDic(myKey) = myDic(myKey) + Cells(i, "B")
        
        Else
            'キーが無ければ新たに登録
            myDic.Add myKey, Cells(i, "B").Value
        
        End If
    Next i
    
    Dim val As Variant
    i = 2
    For Each val In myDic.keys  'キーを取り出していく
        Cells(i, "D") = val
        Cells(i, "E") = myDic(val)
        i = i + 1
    Next
    
End Sub

結果は以下のようになります。

最後に

辞書は応用範囲が広く、アイデア次第でさまざまな場面で活躍します。
辞書の値には数値や文字列だけでなく、配列なども入れることができますし、
辞書を配列の要素として仕込むこともできます。
また、キーを指定することで値を瞬時に取り出せる所が、辞書の魅力と言えます。

注意点(エラー回避)

セルの値を辞書のキーに入れる時は.Valueを付けるようにします。
付けないとエラーとなる場合があります。

myDic.Add Cells(i, "A"), Cells(i, "B") ’エラーの原因となる
myDic.Add Cells(i, "A").Value, Cells(i, "B") ’キーには、Valueを付けること!
タイトルとURLをコピーしました