【VBA】配列が使いにくい時の選択肢
VBAの配列はセルの情報を読み取ったり、書き込むときにはとても使い勝手の良いものです。
その反面、要素を追加したり、削除したりするのは気にすることが多くやりづらいです。
こうした要素の追加と削除は配列でなく、次の2つの変数を使うのが向いています。
Collection(コレクション)
Dictionary(辞書型)
この2つなら要素を追加したり、削除することを簡単に行うことができます。
CollectionやDictionaryを使ったことがない、という方は覚えてみてください。
Collectionの使い方
ここからはCollectionの使い方を簡単に説明します。
Sub Sample()
'空のコレクションを作成
Dim col As Collection
Set col = New Collection
End Sub
VBAでコレクションを使うには、まず、Collectionクラスを使用してコレクションオブジェクトを作成する必要があります。
上のプログラムはコレクションオブジェクトを作成しています。
Sub SampleAdd()
'空のコレクションを作成
Dim col As Collection
Set col = New Collection
'コレクションに要素を追加
col.Add "item"
End Sub
コレクションに要素を追加するにはAddメソッドを使います。
itemはコレクションに追加する要素(中身)です。
このプログラムでは文字列を入れていますが、数値や配列なども入れることができます。
コレクションでは配列のように要素数を気にせず、Addメソッドを使うだけで何個も要素を追加することができます。
(要素の削除はRemoveメソッドでできます)
Sub SampleItem()
'空のコレクションを作成
Dim col As Collection
Set col = New Collection
'コレクションに要素を追加
col.Add "Item"
'コレクションから要素を取り出す
Debug.Print col.Item(1) 'インデックスで取り出す
End Sub
Itemメソッドを使うとコレクションから要素を取り出せます。
Sub SampleFor()
'空のコレクションを作成
Dim col As Collection
Set col = New Collection
'コレクションに要素を追加
col.Add "Item1"
col.Add "Item2"
'コレクションから要素を取り出す
Dim i As Long
For i = 1 To col.count
Debug.Print col.Item(i)
Next
End Sub
For文を使うことで、要素を連続して取り出すこともできます。
col.countとすれば要素の数が分かるため、1 to col.countとすれば全要素を取り出すことができます。
このように数行書くだけで、無制限にデータ(要素)の追加と取り出しができます。
ピンと来なかったら、同じプログラムを配列で書いてみてください。
とてもややこしいプログラムになると思います。
Dictionaryの使い方
Dictionaryは辞書型や連想配列とも呼ばれます。
Dictionaryでは、keyとitemが1対1に結び付けられます。
例えば、keyに"rain"、itemに"雨"としておくと、Dictionary.Item ("rain")が"雨"を返します。
Collectionでもkeyを設定することはできるのですが、あるkeyがすでに存在しているか確認するのは、Dictionaryしかできません。
ちょっと、ピンと来ないかもしれませんが、実際のサンプルプログラムを見て感じてみて下さい。
Dictionaryオブジェクトを使うためには、「Microsoft Scripting Runtime」を参照する必要があります。(設定方法は上のリンク先を参照)
Sub DictionarySample()
'空のDictionaryを作成
Dim dic As Dictionary
Set dic = New Dictionary
End Sub
まずはDictionaryオブジェクトを作るプログラム。ここらへんはCollectionと同じです。
Sub SampleAdd()
'空のDictionaryを作成
Dim dic As Dictionary
Set dic = New Dictionary
'Dictionaryに要素を追加
dic.Add "rain", "雨"
End Sub
Dictionaryに要素を追加するときもAddメソッドを使います。
dic.Add "key", item とします。(itemには配列やオブジェクトを入れることもできます)
DictionaryのAddメソッドでは、必ずkeyを設定する必要があります。
サンプルプログラムでは、"rain"というkeyに、"雨"を代入しています。
Sub SampleItem()
'空のDictionaryを作成
Dim dic As Dictionary
Set dic = New Dictionary
'Dictionaryに要素を追加
dic.Add "rain", "雨"
'Dictionaryから要素を取り出す
Debug.Print dic.Item("rain")
End Sub
こちらもItemメソッドを使うとDictionaryから要素を取り出せます。
Sub SampleExists()
'空のDictionaryを作成
Dim dic As Dictionary
Set dic = New Dictionary
'Dictionaryに要素を追加
dic.Add "rain", "雨"
If dic.Exists("rain") Then
Debug.Print "rainはkeyにあります"
End If
End Sub
Existsメソッドを使うと、指定したkeyがDictionaryの中に存在するか確認することができます。
これはCollectionには存在しないメソッドです。
Sub SampleExists()
'空のDictionaryを作成
Dim dic As Dictionary
Set dic = New Dictionary
Dim arr
arr = Array("sunny", "rainy", "snow")
'Dictionaryに要素を追加
Dim one
For Each one In arr
dic.Add one, one 'arrの中身を順番に追加
Next
'keyがあるか判定
If dic.Exists("cloudy") Then
Debug.Print "cloudyはkeyにあります"
Else
Debug.Print "cloudyはkeyにありません"
End If
End Sub
そのため、Dictionaryではこのようなプログラムが書けます。
ここでは、最初にDictionaryに天気の情報をいくつか追加しています。
そして、cloudyがkeyにあるかを確認しています。
このように複数の配列の中に、特定の要素が存在するかを簡単に確認することができます。
keyとitemを紐づけて管理したいときや、keyの存在確認をしたいときには便利な存在です。
配列ではやりにくいなと感じたときは、Dictionaryのことを思い出してやってください。
ちなみに、使い方にピンと来なかったら、こちらの例も読んでみてください。
こちらは実際にときどき使うこともある、かなり具体的な例です。