英語の"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でキーを削除しておくとか、コレクション全体を消すコマンドもないので、その時は、連想配列で行くしかない思うのでした。