2021年8月31日火曜日

具体的に上手な使い道を知らないと、コマンドを知っているだけで、宝の持ち腐れになるな - Collectionオブジェクト(VBA)

      
英語の"Collection"は、コレクションと日本語でも一般化した収集の意味です。
郵便ポストの郵便物を回収する場合も、英語圏はこの言葉を使用するんだとか。

言い回し上、集金の意味にもなるそうですが、VBAのコレクションは何だろう。
模範解答では、同種のオブジェクトを複数まとめたものを指して表現するんだ。

簡単に言えば、学校のクラス名簿のようなデータを、VBAで取り込む分けです。
生徒名には番号順で氏名が振られていまして、これをメモリーに流し込みます。

でも、こういった名簿は、ワークシートに入力が終わって表示されているもの。
わざわざ、パソコンのメモリーに書き込んで使うとしたら、活用法はあるのか。

ネットで一般的に紹介されているのは、このコレクションのコード記述の解説。
なので、便利な使い道を教えてくれるサイトが少ないので、紹介してみたいな。

上記のサンプルデータは、みかん、りんご、ぶどう、もも等と果物を使います。
単価いくら、何個とか割り振られますが、同じ果物でも係数が変化するのです。

こういった要素が沢山あって、係数がまちまちなデータがあるとしましょうか。
要素は繰り返し何度でも出て重複しますので、純粋な要素の数だけ把握したい。

しかも、可変する係数に紐づけられた要素が数百にでもになれば、適いません。
単純に要素の数が何個あるのか抜き出す時、このコレクションは鬼に金棒なの。

実際、このコレクションでは、キー(Key)、アイテム(Item)を割り振ります。
さっき述べた要素と係数を割り振れますが、ここはキーとアイテムが同一です。

実は、コレクションでは、キーが重複して割り振ることができない仕組みです。キーは省略もできるけれど、この仕組みを利用して、重複する要素を省きます。

Sub Cllctn()
Dim A As New Collection, i As Long
On Error Resume Next ’エラーが出たら次のステートメントから実行
 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
 A.Add Worksheets("Sheet1").Cells(i, 2), Worksheets("Sheet1").Cells(i, 2)
 Next i 'キー(A列)と項目を同じにして格納
On Error GoTo 0 ’エラー処理ルーチンを無効化、重複キーを回避
 For i = 1 To A.Count
     Worksheets("Sheet1").Cells(i, 5) = A(i)
   Debug.Print A(i)
 Next i  ’キー数をカウントして、項目をE列に書き出し
   For i = 1 To A.Count
         A.Remove Cells(i, 5)
   Next i ’メモリー格納のコレクションを消去、ループが面倒
End Sub

同じキーが投入されるとエラーですが、このエラーを回避すると登録しません。
つまり、一番最初に登録した要素だけが残ることになり、重複要素は省かれる。

こうして、コレクションをメモリーに格納したら、コマンドでキーの数を取得。
これを、ワークシートに書き出してもいいし、Debbug.Printで可視化するの。

これがコレクションを使う最大のメリットですが、連想配列でもできるやり方。
ただ違うのは、重複キーの項目(特に実数)を合算できるかどうかという点ね。

つまり、連想配列(Scripting.DIctionary)はOKでも、コレクションは無理だ。
というわけで、コレクションの方は、コード記述が少なくて楽なんだけどなあ。

調べてみると、コレクションは、すでに登録済みのKeyを持つデータを更新するのが面倒なようで、エラーになってしまうため、Removeでキーを削除しておくとか、コレクション全体を消すコマンドもないので、その時は、連想配列で行くしかない思うのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿