【エクセルVBA】AddメソッドでDictionaryオブジェクトにキーと要素を追加する方法


excel,vba,dictionary,add,eyecatch

皆様こんにちは、ノグチです。

前回は、リスト処理にも便利に使える、Dictionaryオブジェクトをご紹介しました。

今回からは、Dictionaryオブジェクトのプロパティやメソッドを順にご紹介していきます。

そして最終的にはループで書かれた重複排除処理のコードを、Dictionaryオブジェクトを使った方法に置き換えていきましょう!

Dictionaryオブジェクトとは?や、宣言の方法は前回の記事でご紹介していますので、併せてご覧ください。

【エクセルVBA】リスト処理に便利!Dictionaryオブジェクトをコードで使うための準備
VBAでリストの重複を排除するのって、ループ文が複数出てきたり、処理速度が落ちたりして、ちょっと躊躇してしまいませんか?Dictionaryオブジェクトを使えば、重複排除もスマートにできるかもしれませんよ。エクセルVBAのDictionaryオブジェクトを、コードで使用するための前準備を紹介しています。
スポンサーリンク

ループを使ったリストの重複排除処理のコード例

例えば、下のリスト。

excel,dictionary,add,リスト

B列の品目が同じレコードは在庫数を加算し、重複を取り除いてF、G列に出力したいとします。

上のリストの処理を、ループ文を複数使ったコードで表現するとこんな感じになります。

Sub TestList()
Dim i As Long
Dim j As Long
Dim flgFind As Long
Dim maxRow  As Long
Dim maxRow_l As Long
Dim strMat, lngNum

With ActiveSheet
    maxRow = .Cells(Rows.Count, 2).End(xlUp).Row
    maxRow_l = 1
    
    For i = 2 To maxRow
        flgFind = 0
        For j = 1 To maxRow_l
            strMat = .Cells(i, 2).Value
            lngNum = .Cells(i, 3).Value
        
            If strMat = .Cells(j, 6).Value Then
                .Cells(j, 7).Value = .Cells(j, 7).Value + lngNum
                flgFind = 1
                Exit For
            End If
        Next j
        
        If flgFind = 0 Then
            .Cells(j, 6).Value = strMat
            .Cells(j, 7).Value = lngNum
            maxRow_l = maxRow_l + 1
        End If
    Next i
    
End With

End Sub

提示したコードは、左側のリストにある品目の値が、右側の出力リストにあるかどうかをループで探し、対象の品目が右側のリストにあった場合は在庫数を加算する、という動作をします。

では、このコードをDictionaryオブジェクトを使ったコードに置き換えて行きましょう!

Dictionaryオブジェクトでの処理順序はこんな感じです。

  1. Dictionaryオブジェクトにキーと要素を追加する
  2. 対象のレコードがDictionaryオブジェクトに存在するかをチェックする
  3. Dictionaryオブジェクトに存在するキーと要素を使った値の処理

このステップに沿って、Dictionaryオブジェクトのメソッドやプロパティをご紹介していき、最終的には上で提示したコードをDictionaryオブジェクトを使ったコードに置き換える、というのがゴールです。

ということで、今回は1.Dictionaryオブジェクトにキーと要素を追加する方法についてご紹介します。

AddメソッドでDictionaryオブジェクトにキーと要素を追加する

まずは、Dictionaryオブジェクトにキーと要素を追加する方法です。

これには、DictionaryオブジェクトのAddメソッドを使います。

記述方法はこちら。

Dictionaryオブジェクト.Add キー, 要素

Addメソッドでコードを置き換えてみる

実際に上のリストの値を使ったコードにすると、こんな感じになります。

Sub Dictionary_Example()

Dim dic as Dictionary 'Dictionaryオブジェクトの宣言
 
    Set dic = New Dictionary

    dic.Add "鉛筆", 36

End sub

Addメソッドの部分に直接値を指定していますが、セル指定でも可能です。

その場合、

dic.Add "鉛筆", 36

の部分を

dic.Add ActiveSheet.Cells(j, 2).Value, ActiveSheet.Cells(j, 3).Value

とすればOK。

Dinctionaryオブジェクトのプロパティ

さて、Dictionaryオブジェクトに値が追加できているかどうか、確認してみましょう。

Dictionaryオブジェクトに追加されたキーの要素を取得するには、Itemプロパティを使います。

Itemプロパティ

Itemプロパティは、Dictionaryオブジェクトの、キーに対する要素の値を取得したりするプロパティです。

記述方法はこちら。

Dictionaryオブジェクト.Item (キー)
これで、指定したキーの要素の値を取得することができます。

このプロパティを使って、先ほどのコードでDictionraryオブジェクトにキーと要素が追加できているか見てみましょう。

先ほどのコードの後に、

Debug.Print dic.Item("鉛筆")

を追加して実行してみると…

Dictinary,Item,イミディエイト

この通り、「鉛筆」というキーに対して「36」という値が要素に追加されているのがわかりますね。

最後に

今回は、AddメソッドでDictionaryオブジェクトにキーと要素を追加する方法をご紹介しました。

次回は、指定した値がDictionaryオブジェクトのキーに存在しているかどうか?をチェックしてくれる、Existsメソッドをご紹介していきます。

【エクセルVBA】DictionaryオブジェクトのExistsメソッドで重複があるかを確認する方法
複数のループを使った重複排除のVBAコードを、Dictionaryオブジェクトとメソッドを使ったコードをに置き換えていく方法をご紹介しています。今回は、指定した値がDictionaryオブジェクトに既に登録されているかどうか?をチェックしてくれる、Existsメソッドのご紹介です。

それでは、最後までお読みいただきありがとうございました!

連載目次:エクセルVBAのDictionaryオブジェクトでリストの重複を排除する

エクセルVBAでリストの重複を排除する方法として、Dictionaryオブジェクトを使った重複排除の方法をご紹介しています。

  1. 【エクセルVBA】リスト処理に便利!Dictionaryオブジェクトをコードで使うための準備
  2. 【エクセルVBA】AddメソッドでDictionaryオブジェクトにキーと要素を追加する方法
  3. 【エクセルVBA】DictionaryオブジェクトのExistsメソッドで重複があるかを確認する方法
  4. 【エクセルVBA】Dictionaryオブジェクトを使ったリストの重複排除プログラム
  5. 【エクセルVBA】重複排除処理が速いのはどっち?Dictionaryオブジェクト vs 複数ループ
  6. 【エクセルVBA】Dictionaryに格納したキーと要素をリストに書き出す方法

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