TopProgramming LanguageVB/VBA > 2014年2月
2014年2月27日

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

February 27,2014 1:55 AM
Tag:[, ]
Permalink

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.参考サイト

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

Comments [0] | Trackbacks [0]
2014年2月12日

Excel VBAで正規表現のグループ化を使ってマッチ文字列を取得する

February 12,2014 1:55 AM
Tag:[, ]
Permalink

Excel VBAで正規表現のグループ化を使って、複数のマッチ文字列を取得する方法を紹介します。

1.はじめに

Excel VBAで正規表現を使って文字列をマッチさせる方法」では、文字列が正規表現にマッチしたかどうかの判定を行う方法を解説しました。

ただ、実際のプログラムでは判定だけでなく、マッチした文字列を取得して利用するケースが少なくないと思います。

ということで、正規表現のグループ化を使ったマッチ文字列の取得方法を紹介します。

こちらも元記事と同様、ネットで検索しても分かりやすいサンプルがなかったので、できるだけ無駄なものを省いたサンプルを使って説明したいと思います。

2.正規表現のグループ化を使って複数の文字列を取得する

ここでは「2014/02/22 12:34:56」という年月日時分秒を示す文字列から、すべての数字を抜き出すサンプルで解説します。

サンプルコードは次のとおりです。

Sub test()
    Dim str As String
    str = "2014/02/22 12:34:56"
    
    Dim regex
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)"
    regex.Global = True
     
    Dim result
    Set result = regex.Execute(str)
    If result.Count > 0 Then
        Set result2 = result(0).SubMatches
        For i = 0 To result2.Count - 1
            MsgBox result2(i)
        Next
    End If
 
    Set regex = Nothing
End Sub

以下、解説です。

Excel VBAで正規表現を使って文字列をマッチさせる方法」と重複する部分については割愛しています。すいませんが元記事の解説を参照してください。

まず検索文字列に「2014/02/22 12:34:56」を設定します。

    Dim str As String
    str = "2014/02/22 12:34:56"

Patternプロパティに、正規表現でマッチさせたいパターンを設定します。ここでグループ化のためのカッコを付与します。

    regex.Pattern = "(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)"

Executeメソッドで文字列マッチを実行したあと、結果はMatchesコレクションとして返却されるので、result.CountでMatchオブジェクトの個数を判定します。

    If result.Count > 0 Then
        …中略…
    End If

グループ化で文字列を取得するには、If文の中で、result(0)に対してSubMatchesを実行し、SubMatchesコレクションを取得します。

        Set result2 = result(0).SubMatches

SubMatchesコレクションには個別のサブマッチ文字列(ここではマッチした「2014」「02」「22」「12」「34」「56」)が格納されているので、あとはFor文で順番に取得すればOKです。

        For i = 0 To result2.Count - 1
            MsgBox result2(i)
        Next

MsgBoxには「2014」「02」「22」「12」「34」「56」の順で表示されます。

Comments [0] | Trackbacks [0]
2014年2月 4日

Excel VBAで正規表現を使って文字列をマッチさせる方法

February 4,2014 1:55 AM
Tag:[, ]
Permalink

Excel VBAで正規表現を使って文字列をマッチさせる方法を紹介します。

1.はじめに

Excel VBAでは正規表現による文字列マッチを行うことが可能ですが、PHPやPerlなどより、お作法がちょっと面倒です。

また、ネットで検索してもパッとみて分かるようなサンプルがなかったので、できるだけ無駄なものを省いたサンプルを使って本エントリーで説明してみたいと思います。

2.文字列をマッチさせるサンプル

正規表現を使って文字列をマッチさせるサンプルは次のとおりです。

Sub test()
    Dim str As String
    str = "foo bar hoge"
    
    Dim regex 
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "\s\w+\s"
    
    Dim result
    Set result = regex.Execute(str)
    If result.Count > 0 Then
        MsgBox result(0)
    End If
 
    Set regex = Nothing
End Sub

解説です。

まず検索対象の文字列を作ります。ここでは「foo bar hoge」とします。

    Dim str As String
    str = "foo bar hoge"

次に正規表現のためのオブジェクトを作成します。

    Dim regex
    Set regex = CreateObject("VBScript.RegExp")

Patternプロパティに、正規表現でマッチさせたいパターンを設定します。

    regex.Pattern = "\s\w+\s"

Executeメソッドで文字列マッチを実行します。結果はMatchesコレクションとして返却されます。

    Dim result
    Set result = regex.Execute(str)

result.CountでMatchオブジェクトの個数が分かります。個数が0以上であればマッチしたことを意味するので、結果を表示します。ここでは「 bar 」がマッチするので、0番目の内容だけを出力します。

    If result.Count > 0 Then
        MsgBox result(0)
    End If

パターンマッチが終わったらオブジェクトへの参照を解除します。

    Set regex = Nothing

実行結果のMsgBoxには「 bar 」が表示されます。

3.複数回マッチさせる

2項のサンプルでは、検索文字列にマッチする文字が複数回出現しても1度しかマッチしません。

複数回マッチさせるには、以下の1行を追加します。

regex.Global = True

サンプルの正規表現や実行結果部分も複数マッチに対応できるよう変更します。追加・変更部分を赤色で示します。

Sub test()
    Dim str As String
    str = "foo bar hoge"
    
    Dim regex
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "\w+"
    regex.Global = True
    
    Dim result
    Set result = regex.Execute(str)
    If result.Count > 0 Then
        For i = 0 To result.Count - 1
            MsgBox result(i)
        Next
    End If
 
    Set regex = Nothing
End Sub

実行結果のMsgBoxには「foo」「bar」「hoge」が表示されます。

4.大文字・小文字を区別する

大文字・小文字を区別するには以下の1行を追加します。

regex.IgnoreCase = True

サンプルの検索対象の文字列を「foo Foo FOO」に変更してマッチ文字列を「foo」にします。追加・変更部分を赤色で示します。

Sub test()
    Dim str As String
    str = "foo Foo FOO"
    
    Dim regex
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "foo"
    regex.Global = True
    regex.IgnoreCase = True
    
    Dim result
    Set result = regex.Execute(str)
    If result.Count > 0 Then
        For i = 0 To result.Count - 1
            MsgBox result(i)
        Next
    End If
 
    Set regex = Nothing
End Sub

実行結果のMsgBoxには「foo」「Foo」「FOO」が表示されます。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3