
VBAでプログラムを作っていると、データを検索したり、同じデータがあるか確認したりすることがあります。
もちろんFor文を使って、上から順番にデータを探していくこともできます。
ただ、プログラムを作っていると、
「このデータがあるかどうか、すぐに確認したい」
とか、
「この番号に対応するデータを取り出したい」
ということが結構あります。
そんなときに便利なのが、Dictionary(ディクショナリ)です。
僕も以前はFor文を使って検索することが多かったのですが、Dictionaryを使うようになってから、こういうデータ処理がかなり楽になりました。
VBAの配列っていまいちわかりにくいから避けてたところもあります。
今回は、VBAのDictionaryについて、基本的な使い方を簡単に紹介してみたいと思います。
Dictionaryって何?
Dictionaryを簡単に説明すると、**「キー」と「値」をセットで保存しておけるもの**です。
例えば、こんなデータがあるとします。
| キー | 値 |
|---|---|
| A001 | りんご |
| A002 | みかん |
| A003 | バナナ |
「A001」という番号に「りんご」を登録しておく。
そして後から「A001」と指定すると、「りんご」を取り出すことができます。
イメージとしては、
A001 → りんご
A002 → みかん
A003 → バナナ
こんな感じです。
Excelでいうと、VLOOKUPやXLOOKUPで「この番号に対応するデータは何かな?」と探すのに少し似ています。
ただし、Dictionaryの場合はExcelのセルを検索するというより、VBAのプログラムの中にデータを持っておくという感じです。
まずはDictionaryを作ってみる
では、実際にDictionaryを作ってみます。
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
これだけでDictionaryを使えるようになります。
ここでは`dic`という変数にDictionaryを入れています。
変数名は好きな名前で大丈夫ですが、今回は分かりやすく`dic`にしておきます。
Dictionaryにデータを入れる
Dictionaryにデータを入れるには、`Add`を使います。
dic.Add "A001", "りんご" dic.Add "A002", "みかん" dic.Add "A003", "バナナ"
これでDictionaryの中に、
A001 → りんご
A002 → みかん
A003 → バナナ
というデータが入りました。
書き方は、
dic.Add "キー", "値"
です。
最初の`”A001″`がキーで、次の`”りんご”`が値になります。
最初は「キーって何?」となるかもしれませんが、ここでは**データを探すときの目印**くらいに考えておけばいいと思います。
登録したデータを取り出してみる
では、登録したデータを取り出してみます。
例えば、
Debug.Print dic("A001")
としてみます。
すると、
りんご
と表示されます。
つまり、
dic("A001")
と書くことで、
「A001に登録されている値をちょうだい」
ということになります。
これはDictionaryを使う上でかなり基本的なところなので、覚えておくといいと思います。
データがあるか確認する
もう一つ、Dictionaryでよく使うのが`Exists`です。
例えば、
「A001というデータはDictionaryの中にあるかな?」
と確認したい場合です。
If dic.Exists("A001") Then
Debug.Print "A001は存在します"
End If
とします。
`Exists`は、指定したキーがあれば`True`、なければ`False`を返します。
なので、
If dic.Exists("A001") Then
と書けば、
「A001があったら、この中の処理をする」
ということができます。
これは実際のプログラムでも結構使います。
簡単なサンプルを作ってみる
ここまでの内容を使って、簡単なプログラムを作ってみます。
今回は、商品コードから商品名を探すプログラムにしてみます。
Sub DictionaryTest()
Dim dic As Object
Dim code As String
Set dic = CreateObject("Scripting.Dictionary")
'商品データを登録
dic.Add "A001", "りんご"
dic.Add "A002", "みかん"
dic.Add "A003", "バナナ"
'検索する商品コード
code = "A002"
'商品コードがあるか確認
If dic.Exists(code) Then
'商品名を表示
Debug.Print dic(code)
Else
Debug.Print "商品がありません"
End If
End Sub
これを実行すると、
みかん
と表示されます。
処理としては、それほど難しくありません。
まずDictionaryを作ります。
Set dic = CreateObject("Scripting.Dictionary")
そして商品コードと商品名を登録します。
dic.Add "A001", "りんご" dic.Add "A002", "みかん" dic.Add "A003", "バナナ"
今回は、
code = "A002"
としているので、「A002の商品は何かな?」と探すことになります。
そこで、
If dic.Exists(code) Then
として、まずA002が登録されているか確認します。
A002は登録されているので、その中の、
Debug.Print dic(code)
が実行されます。
`code`には「A002」が入っているので、結果として「みかん」が表示されます。
Dictionaryを使うと何が便利なの?
ここまで見ると、
「これならFor文でもできるんじゃない?」
と思うかもしれません。
実際、その通りです。
今回くらいの簡単なデータなら、For文でも問題なく処理できます。
ただ、VBAで少し複雑なプログラムを作っていると、
「このデータがあるか確認したい」
「この番号に対応するデータを取り出したい」
という処理が何度も出てくることがあります。
そんなときにDictionaryを使うと、処理をかなりシンプルに書ける場合があります。
例えば、
- データが存在するか確認する
- データをキーと値で関連付ける
- 同じデータがあるか調べる
- 一度取得したデータを保存しておく
- ある番号から対応するデータを取り出す
といった処理です。
特に僕がDictionaryを使っていて便利だと思うのは、
「この値を目印にして、対応するデータを取り出す」
という使い方です。
まとめ
Dictionaryは、最初は少し分かりにくいかもしれません。
僕も最初は「Dictionaryって何に使うんだろう?」という感じでした。
でも、
キー → 値
という仕組みが分かってくると、意外と簡単です。
今回紹介した基本的な使い方は、
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "キー", "値"
dic("キー")
dic.Exists("キー")
このあたりです。
まずはこの4つを覚えておけば、Dictionaryを使った簡単な処理は作れると思います。
VBAでデータを扱っていると、Dictionaryが便利だと感じる場面は結構あります。
僕自身も最近VBAでデータを処理するときにDictionaryを使うことが増えてきました。
最初から全部覚える必要はないので、まずは簡単なサンプルを実際に動かしてみると分かりやすいと思います。
