Excel VBAでハッシュを使う方法のまとめ

Excel VBAでハッシュを使う方法のまとめ

Posted at February 27,2014 1:55 AM
Tag:[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.参考サイト

参考サイトは以下です。ありがとうございました。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)