【エクセル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に格納したキーと要素をリストに書き出す方法

  投稿者プロフィール

ノグチフリーランスPG・SE
元製造子会社SE。
業務システム保守・導入両方やった経験をお伝えすることで、少しでもシステムや手作業に悩まされる人が減ればいいなぁと日々夢見ております。

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