Excel VBAでハッシュを使う方法のまとめ
Excel VBAでハッシュを使う方法のまとめです。
1.はじめに
Excel VBAではハッシュテーブル(連想配列)を使うことができます。
で、ネットで検索してもパッとみて分かるようなサンプルがなかったので、できるだけ無駄なものを省いたサンプルを使って本エントリーで説明してみたいと思います。
2.サンプル
まずはざっくりしたサンプルから紹介します。
Sub test()
Dim obj As Object
Set obj = CreateObject("Scripting.Dictionary")
obj.Add "foo", 100
obj.Add "bar", 200
obj.Add "hoge", 300
Dim key As Variant
For Each key In obj
MsgBox obj(key)
Next key
Set obj = Nothing
End Sub
以下、サンプルの解説です(細かい動作やサンプル以外の機能については後述します)。
ハッシュではDictionaryオブジェクトを定義します。Dictionaryオブジェクトは、キーと対応する項目(値・データ)が格納できるオブジェクトです。
Dim obj As Object
Set obj = CreateObject("Scripting.Dictionary")
Addというメソッドでハッシュにデータを追加します。このサンプルではキー「foo」の値「100」、キー「bar」の値「200」、キー「hoge」の値「300」を設定しています。
obj.Add "foo", 100
obj.Add "bar", 200
obj.Add "hoge", 300
ハッシュからすべての値を読みだします。
Dim key As Variant
For Each key In obj
MsgBox obj(key)
Next key
最後にハッシュをクリアします。
Set obj = Nothing
以下、各メソッドおよびプロパティの解説です。
3.ハッシュにキーと値を追加する
キーと値を追加するにはAddメソッドを利用します。
obj.Add "foo", 100
Addの直後にキー、その後にカンマ区切りで値を設定します。値にはオブジェクトを設定することも可能です。
Addで追加する場合、同じキーが存在したときはエラーとなります。
またItemプロパティを利用する方法もあります。Itemプロパティを利用すれば、同じキーが存在したとき上書きします。
設定方法は次のとおりです。
obj.Item("foo") = 100
「.Item」は省略可能です。
obj("foo") = 100
サンプルを書き換えると次のようになります。
Sub test()
Dim obj As Object
Set obj = CreateObject("Scripting.Dictionary")
obj("foo") = 100
obj("bar") = 200
obj("hoge") = 300
Dim key As Variant
For Each key In obj
MsgBox obj(key)
Next key
Set obj = Nothing
End Sub
4.ハッシュから指定したキーで値を取得する
取得は次のように記述します。
MsgBox obj.Item("foo")
「.Item」は省略可能で、これがサンプルと同じ書き方になります。
MsgBox obj("foo")
繰り返し処理でハッシュを操作する場合、サンプルのようにFor~Eachステートメントでハッシュのキーを取得できます。
For Each key In obj
MsgBox obj(key)
Next key
5.キーを書き換える
Dictionaryオブジェクトはキーを書き換えることができます。
キーを書き換えるには、keyプロパティを利用します。
以下を実行すると「foo」というキーが「aaa」に書き換わり、キー「aaa」で値が取得できます。
obj("foo") = 100
obj.Key("foo") = "aaa"
MsgBox obj("aaa")
6.キーの大文字・小文字を区別する
キーの大文字・小文字を区別するにはCompareModeプロパティを利用します。
CompareModeプロパティに設定する値は以下のいずれかです。
- vbBinaryCompare(または0):大文字小文字を区別
- vbTextCompare(または1):大文字小文字を区別しない
デフォルトは大文字小文字を区別します。
以下のサンプルでは最後の行で「このキーは既にこのコレクションの要素に割り当てられています。」というエラーとなります。
obj.CompareMode = vbTextCompare
obj.Add "foo", 1
obj.Add "FOO", 2
エラーメッセージ
7.データ数をカウントする
データ数をカウントするにはCountプロパティを利用します。
次のサンプルでは「3」が出力されます。
obj.Add "foo", 100
obj.Add "bar", 200
obj.Add "hoge", 300
MsgBox obj.Count
8.指定したキーが存在することを確認する
指定したキーが存在することを確認するには、Existsメソッドを利用します。
次のサンプルでは「True」が出力されます。
obj.Add "foo", 100
MsgBox obj.Exists("foo")
次のサンプルでは「False」が出力されます。
obj.Add "foo", 100
MsgBox obj.Exists("fuga")
9.ハッシュのキーを配列で取得する
ハッシュのキーを配列で取得するには、Keysメソッドを利用します。
以下を実行すると、「foo」「bar」「hoge」が出力されます。
obj.Add "foo", 100
obj.Add "bar", 200
obj.Add "hoge", 300
Dim list() As Variant
list = obj.Keys
For i = 0 To UBound(list)
MsgBox list(i)
Next i
10.ハッシュの値を配列で取得する
ハッシュの値を配列で取得するには、Itemsメソッドを利用します。
以下を実行すると、「100」「200」「300」が出力されます。
obj.Add "foo", 100
obj.Add "bar", 200
obj.Add "hoge", 300
Dim list() As Variant
list = obj.Items
For i = 0 To UBound(list)
MsgBox list(i)
Next i
11.指定したキーで削除する
指定したキーで削除するにはRemoveメソッドを利用します。
以下を実行すると、登録したデータの1つが削除されるので「2」が出力されます。
obj.Add "foo", 100
obj.Add "bar", 200
obj.Add "hoge", 300
obj.Remove("foo")
MsgBox obj.Count
12.すべてのデータを削除する
ハッシュのすべてのキーおよび値を削除するには、RemoveAllメソッドを利用します。
以下を実行すると、登録したすべてのデータが削除されるので「0」が出力されます。
obj.Add "foo", 100
obj.Add "bar", 200
obj.Add "hoge", 300
obj.RemoveAll
MsgBox obj.Count
13.参考サイト
参考サイトは以下です。ありがとうございました。