見出し画像

【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のことを思い出してやってください。

ちなみに、使い方にピンと来なかったら、こちらの例も読んでみてください。
こちらは実際にときどき使うこともある、かなり具体的な例です。


この記事が気に入ったらサポートをしてみませんか?