逆境から飛躍へ 

~30代からのスキルアップ~

VBA Dictionary(連想配列)の一歩踏み込んだ使い方について

 

・・・・・・ブログ村参加中!・・・・・・

ブログランキング・にほんブログ村へにほんブログ村

PVアクセスランキング にほんブログ村

応援お願いいたします!

・・・・・・・・・・・・・・・・・・・・

 

 皆さん、おはようございます。

 

 

 今日は、VBA関連です。

 

 

 VBAを使用したマクロって

 作業短縮にとても便利ですよね(^^)

 

 

 どのパソコンでも

 VisualStudioとかのIDE

 入っていなくても

 Excelは入っていることが多いので

 使用する環境は

 整っていることが多いです。

 

 

 そういった意味で

 とても使いやすいのでは

 ないでしょうか。

 

 

 そんな中で、C#やVB.NETのListのような

 使い方ができるDictionaryについて

 今回ご紹介したいと思います。

 

 

 配列のようにRedimしなくてよく

 どんどん追加できると

 いった利点があります。

 

 

 以前は、key値とItem値の

 一対一でしか使用できない為、

 使いづらいなと思っていましたが

 使い方次第では

 その点も克服できることが分かり

 とても便利だと感じました。  

 

 

 今回はそんなとても便利な

 VBAのDictionaryの使い方です。

 

 

 最後に他人のVBAを見て

 あっ、なるほどと思った

 使い方も最後に書きたいと思います(^^)

 

 

 

 

 

1.Dictionaryオブジェクトとは

  Dictionaryオブジェクトは

  キーとデータを

  セットにして格納する

  オブジェクトです。

 

 

  Keyの部分に文字列等をセット出来る為、

  辞書、連想配列と呼ばれます。

 

 

  配列はインデックス番号で

  データを引っ張りますが

  連想配列はKeyで

  データを引っ張ります。

 

 

  Keyは、重複できないので

  ご注意ください。

 

2.Dictionaryを使用する為の下準備

  CreateObjectを使用する場合と

  参照設定を行う方法があります。

 

 

  ■CreateObjectを使用する場合 

   下記の宣言を記載すれば

   使用する準備が整います。

 

  

   Dim ディクショナリ名 As Object

   Set ディクショナリ名 = _

   CreateObject("Scripting.Dictionary")

 

 

   ※「_」は改行する際に

    同じ行のコードを表すものです。

    1行に記載する場合は

    必要ありません。

 

 ■参照設定を行う場合

  1.メニューバーのツール、

    参照設定をクリックします。

 

  

 

  2.「Microsoft Scripting Runtime」を

    選択してOKをクリックする。

    ※画像にはチェックが

     入っていませんが

     実際はチェックを入れた状態で

     OKをクリックします。

 

   

 

  3.下記の宣言を記載して使用する。

    ※2行で書く場合

     Dim ディクショナリ名 As Dictionary

     Set ディクショナリ名 = New Dictionary

 

    ※1行で書く場合

     Dim ディクショナリ名 As New Dictionary

 

 

3.要素の追加方法(Add)

  下記で値セットを

  追加することが出来ます。

  

  ディクショナリ名.Add Key , Item

 

  

 

  Debug.Printは「ITEM」が出力されます。

 

4.Keyの存在確認方法(Exists)

  下記でKeyの存在確認を

  行うことが出来ます。

 

  

 

  Debug.Printは「True」が出力されます。

 

 

5.値セットを削除する方法(Remove及びRemoveAll)

  下記での値セットを

  取得することが出来ます。

 

  ※Keyに対応した値セットを削除する場合

  ディクショナリ名.Remove(KEY)

  ※全削除する場合

  ディクショナリ名.RemoveAll

 

  

 

  最初のFor Eachでは、

  Debug.Printは「ITEM2」、「ITEM3」が

  出力されます。

  ※KEY3の値はITEM3に

   するつもりでしたが

   間違えました苦笑

 

  次のFor Eachでは、

  Debug.Printは何も出力されません。

 

 

6.Key及びItemの全ての値を配列で取得する方法(Keys及びItems)

  下記でのKeysとItemsの全値を

  取得することが出来ます。

 

  ディクショナリ名.Keys

  ディクショナリ名.Items

  

 

 

 最初のFor Eachは、

 「KEY1」「KEY2」が

 出力されます。

 

 次のFor Eachは、

 「ITEM1」「ITEM2」が

 出力されます。

 

7.値セットのセット数をカウントする(Count)

  下記でのセット数を

  取得することが出来ます。

 

  ディクショナリ名.Count

  

  

 

 

 

8.一歩踏み込んだ使い方

  今回ご紹介する方法は、

  ・同じKeyがあった場合は

   追加しない方法

   ※エラー回避

  ・複合キーに対応する方法

  ・複合値に対応する方法

 

  データはこちらの本の

  Dokoqlに拝借しました。

 

  

 

dokoQL

 

※自分の時よりだいぶ進化していて

 驚きました汗

 

  今回のマクロは

  H行、I行、J行にKeyを入れて

  一致するものを

  K行、L行、M行に

  出力するという内容です。  

 

 

 

 

 

 まずは

 「同じKeyがあった場合は

  追加しない方法」

 です。

 

 

 これはDictionaryのExistsを

 使用することで対応可能です。

 

 

 Existsは、存在すれば

 Trueを返すので

 無ければFalseを返します。

 

 

 なのでIf Notと組み合わせれば

 エラーを起こさず

 追加することが出来ます(^^)

 

 

 そして、複合キーと複合値の

 対応方法は無理やり

 くっつけてしまうというものです。

 

 

 そして、後から取り出せるように

 「-」だったり、「/」だったり

 記号で繋げて

 後で分割するという方法です。

 

 

 ネットで他の人が

 作ったプログラムを見て

 なるほどと思いました(^^)

 

 

 ちなみに実行結果はこんな感じです。

 

 

 

 

 他にもCompareModeなどといった

 プロパティもありますが、

 今回はここまでとしたいと思います(^^)

 

 

 大変便利なので

 是非使ってください(*^^*)

 

 

 それでは、またヽ(^o^)丿

 

 

 

 

9月10日(土) 記録

■プロジェクトマネージャ試験

 ・テキスト読込   実施済

 ・YouTube解説視聴 未実施

 ・午前Ⅰ過去問   20問

 ・午後Ⅰ過去問   未実施

 ・午後Ⅱ

  午後Ⅱ問題読み込み 実施済

 

■動画学習 実施済

 

IPA秋季試験まで 28日

 

 

 

この記事を最後まで読んで頂いて、

本当にありがとうございます!

 

ブログランキング・にほんブログ村へにほんブログ村

PVアクセスランキング にほんブログ村

 

もし、記事が参考になった、

面白かったと少しでも

感じていただくことが出来たなら、

クリックしていただけたら嬉しいです(^^)

 

応援お願いいたします!