【VBA Dictionary オブジェクト】 使い方 まとめ

初めまして。
今年の4月に入社し、8月から現場に配属された新人エンジニアです。
配属と同時に今まで全く触ってこなかったVBAの言語を用いての開発などを行うことになりました。
今後、VBAの力をつけていく為にも、Qiitaで主にVBA関連の知識をアウトプットしていきます。

## 目次
[1.本記事で分かること](#1-本記事で分かること)
[2.Dictionaryオブジェクトとは](#2-Dictionaryオブジェクトとは)
[3.Dictionaryオブジェクトの使い方](#3-Dictionaryオブジェクトの使い方)
[4.まとめ](#4-まとめ)
[5.参考文献](#5-参考文献)

## 1. 本記事で分かること
・Dictionaryオブジェクトのプロパティ・メソッド一覧
・VBAのDictionaryオブジェクトの使い方

## 2. Dictionaryオブジェクトとは
「データのキーとアイテムのペアを保存するオブジェクト」のこと
「辞書」、「連想配列」とも呼ばれます。
アイテムには任意の形式のデータを使用できます。
また各アイテムは一意のキーに関連付けられます。
※つまり、キーを重複させることはできません。

## 3. Dictionaryオブジェクトの使い方
### 1.宣言
Dictionaryオブジェクトは外部のライブラリ「Microsoft Scripting Runtime」を参照しています。

①CreateObjectを使う方法
```vb
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
```
②参照設定を使う方法
```vb
Dim dic As New Scripting.Dictionary
```
「ツール」→ 「参照設定」から「Microsoft Scripting Runtime」にチェックを入れる必要があります。

![スクリーンショット 2023-09-10 214653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/51322a48-c8d1-2828-4578-eea8ab750555.png)

### 2. メソッド
#### メソッド一覧
引用：Microsoft公式ドキュメント　https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dictionary-object
![20230910Dictionary_メソッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/6f3a289a-5ced-ed3d-5307-1e51eafce9aa.png)

#### 使用例
```vb
Sub Sample_method()
    Dim a, i, b
    Dim dic As New Scripting.Dictionary
    
    'Add 新しいキー/アイテムのペアを追加
    dic.Add "りんご", "200" 'Key(果物名)、Item(値段)を追加
    dic.Add "いちご", "400"
    dic.Add "メロン", "1000"
    
    '存在するかどうかブール値を返す
    Debug.Print dic.Exists("メロン") '存在するキー
    Debug.Print dic.Exists("梨")     '存在しないキー
    Debug.Print
    
    '全てのキー/アイテムを取得、表示
    a = dic.Keys '全てのキーを取得
    b = dic.Items '全てのアイテムを取得
    For i = 0 To dic.Count - 1
    Debug.Print a(i) & "：" & b(i) & "円"
    Next

    Debug.Print dic.Item("メロン") & "円" '.Itemは省略可
    Debug.Print
    
    '指定のキー/アイテムのペアを削除
    dic.Remove "いちご" 'Item(いちご削除)
    
    '全てのキー/アイテムを取得、表示
    a = dic.Keys '全てのキーを取得
    b = dic.Items '全てのアイテムを取得
    For i = 0 To dic.Count - 1
    Debug.Print a(i) & "：" & b(i) & "円"
    Next
    
    '全てのキーアイテムのペアを削除
    dic.RemoveAll
     
End Sub
```
#### 実行結果
![20230911メソッド実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/00ff1087-c557-3719-b378-daa7fa321c3f.png)


### 3. プロパティ
#### プロパティ一覧
引用：Microsoft公式ドキュメント　https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dictionary-object
![20230910Dictionary_プロパティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/5fb56bbe-ff77-a8b0-39c9-710097c75200.png)

#### 使用例
```vb
Sub Sample_property()
    Dim a, b, i
    Dim dic As New Scripting.Dictionary

    '文字列キーを比較するための比較モード設定
    'Addされてないときに、TextCompareへの設定を行う
    dic.CompareMode = TextCompare '大文字・小文字、ひらがな・カタカナ、全角・半角を区別しない
                                  'デフォルト値はBinaryCompare（区別する)

    'Add 新しいキー/アイテムのペアを追加
    dic.Add "りんご", "200" 'Key(果物名)、Item(値段)を追加
    dic.Add "いちご", "400"
    dic.Add "メロン", "1000"
    
    Debug.Print dic.Exists("めろん") 'TextCompareが設定されているためTrueを返す
    
    'Dictionaryオブジェクトの項目の数を返す
    Debug.Print dic.Count & "個"
    
    'キーに基づいて、アイテムを返す
    Debug.Print dic.Item("めろん") 'ここでもTextCompare発動
    
    'キー、アイテムの値を更新
    dic.Key("りんご") = "みかん"
    dic.Item("いちご") = 600
    
    '全てのキー/アイテムを取得、表示
    a = dic.Keys '全てのキーを取得
    b = dic.Items '全てのアイテムを取得
    For i = 0 To dic.Count - 1
    Debug.Print a(i) & "：" & b(i) & "円"
    Next

End Sub
```

#### 実行結果
![スクリーンショット 2023-09-14 082315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/a6473f24-feb9-77c3-13b0-dd7c650ffbce.png)


## 4. まとめ
今後もVBAの学習の為に記事の投稿をしていきます。
ありがとうございました。

## 5. 参考文献
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dictionary-object