エクセルVBAマクロで連想配列(辞書配列)を使う

テーマはExcelのマクロのついての備忘的なメモ Excelの話

Pythonではよく使う辞書と同じようなものを、ExcelのVBAでも使えるようなので、その使い方を調べたので備忘に残しておきます。

バインディング、オブジェクトの生成

事前バインディング(参照設定する)

VBAのコードの画面で「ツール」⇒「参照設定」から
「Microsoft Scripting Runtime」にチェックをつける。

この設定をしたうえで、コードでは以下の通りオブジェクトを生成する。

'事前バインディング
Dim newDic As New Scripting.Dictionary

遅延バインディング(参照設定しない)

事前の参照設定せずに、遅延バインディングで実行する場合は、CreateObjectで”Scripting.Dictionary”で指定する。

'遅延バインディング
Dim newDic As Object
Set newDic = CreateObject(“Scripting.Dictionary”)

辞書にkeyとvalueを追加する。

Addメソッドで追加できる。

newDic.Add "Taro", 168
newDic.Add "Kazuo", 175

ワークシートの範囲を辞書に追加する。格納データは、ActiveSheetの2行目からで2列目(B列)がKey、3列目(C列)がValueのケース。

Dim StartRow As Long
Dim KeyCol As Long
StartRow = 2
KeyCol = 2

Dim Ws As Worksheet
Set Ws = ActiveSheet

Dim r As Long

For r = StartRow To Ws.Cells(Rows.Count, StartRow).End(xlUp).Row
    newDic.Add Ws.Cells(r, KeyCol).Value, Ws.Cells(r, KeyCol + 1).Value
Next

keyとValueを取り出す

「For Each xx in 辞書配列」でKeyをforで回せる。

ItemメソッドでValueを取り出せる。。

Dim dkey
For Each dkey In newDic
    Debug.Print dkey & ":" & newDic.Item(dkey)        
Next

Keyの存在の確認、Valueの上書き

Keyが存在するかは「Exists」メソッドで調べられる。

Valueを上書きする場合は、「Item」メソッドを使い代入する。

ワークシート上のデータを辞書配列に格納するものを、Key存在を確認し、Keyがある場合はValueを上書きする。

Dim Ws As Worksheet
Set Ws = ActiveSheet

Dim r As Long
Dim tempKey
For r = StartRow To Ws.Cells(Rows.Count, StartRow).End(xlUp).Row
    tempKey = Ws.Cells(r, KeyCol).Value
    
    If newDic.Exists(tempKey) Then
        'Valueを上書きする。
        newDic.Item(tempKey) = Ws.Cells(r, KeyCol + 1).Value
    Else
        newDic.Add tempKey, Ws.Cells(r, KeyCol + 1).Value
    End If
Next

Dim dkey
For Each dkey In newDic
    Debug.Print dkey & ":" & newDic.Item(dkey)
        
Next

以上、Pythonの辞書と同じようなことが、ExcelのVBAにおいても、できることが分かりました。

Excelマクロで配列にワークシートのデータを格納する|ふーた
VBAで配列にワークシート上のデータを格納する方法です。 1次元の配列に格納する。 アクティブなワークシートのB2セルからC4セルの範囲を1次元の配列に格納するコードです。 この場合は、配列の最初の項目は「testArray(0)」と、0 から始まることになります。 Sub List_Test1() Dim ...

コメント

タイトルとURLをコピーしました