
クラスでコレクションを使えるか
ここではクラスモジュールの具体的な使い方をご紹介しています。
1行ごとに DVD 情報を記入したシートがあります。
なぜここでは DVD のデータをオブジェクトとして取り上げたかと言うと、実際私はたくさんのブルーレイ DVD を所有していて、それらの管理にとても苦労した記憶があります。
1行が一つの映画に関する DVD 情報となっています。
つまり1行がひとつのオブジェクトということです。
しかしオブジェクトが複数あります。
基本的な部分は共通で、所々違うという複数のオブジェクトがあり、しかも100も200もあるのです。
どうやって区別したらいいのでしょうか?その方
法としてクラスモジュールの中でコレクションを使うという方法があります。今回はそれについて解説します。
【コンテンツ】
1.前回のおさらい
2.コレクションについて
3.クラスモジュールでコレクションを使う
4.実例 コードの書き方
前回、クラスモジュールに書いたコードを見てみましょう。クラスの宣言セクションに変数を追加すると、そのクラスのプロパティとなります。
追加されたプロパティはメンバーともいいます。

また記述したプロシージャはメソッドとなります。このメソッドはプロパティにセルの値を代入しているコードです。

クラスモジュールに書いたメソッドとプロパティを使うためには、標準モジュールのコード画面にて、インスタンス化というのを行います。
これは変数を宣言して、タイプにクラスを指定することで、実体を与えます。

Mymovieというプロシージャを実行すると、イミディエイトウィンドウに映画のクラスモジュールでコレクションを使う方法と公開年と制作国が書き出されます。
この場合書き出されるのは、1行のデータのまとまりとなります。

しかしシートにあるDVDのデータは複数あります。これをExcelVBAのコレクションとして、クラスで扱えたらべんりです。 すると、dvdという変数をdvd(1),dvd(2),dvd(3),のようなコレクションとして利用できます。

コレクションの中で1つのものを指定するときは、ワークシートやブックを指定するときと同じように指定することができます。

コレクションはItemとKeyをセットで格納します。
宣言の仕方は、以下のようにします。

今回のサンプルは下記の表です。

標準モジュールにてコレクションを宣言します。

Setステートメントでコレクションのデータを取り込む範囲を指定します。

Dim mcoll As New Collection
Dim rg As Range
Set rg = Sheet3.Range("A1").CurrentRegion
Dim i As Long, Movie As clsDvd
For i = 2 To rg.Rows.Count
mcoll.Add rg.Cells(i, 1).Value
Next i
このコードでは、コレクションとしてムービーのクラスモジュールでコレクションを使う方法を取り込んでいます。

イミディエイトウィンドーを見てみましょう。

まだクラスを宣言していませんでした。コレクションが先だったのです。クラスはFor文の前で宣言して、セットするのは、For文の中です。

1行のデータをセルごとにまず、クラスの値に代入します。
3つのプロパティに代入したら、そのMovieという変数をコレクションに追加します。
前に書いていた m
coll.Add rg.Cells(i, 1).Value というコードは、 mcoll.Add Movie に書き換えます。

プロシージャをステップ実行して、ウォッチ式で見てみましょう。 初めに1行目がMovieというクラスに代入されます。

それが、コレクションに追加されていく様子を確認することができます。

Sub ReadData()
Dim mcoll As New Collection
Dim rg As Range
Set rg = Sheet3.Range("A1").CurrentRegion
Dim i As Long, Movie As clsDvd
For i = 2 To rg.Rows.Count
Set Movie = New clsDvd
Movie.MTitle = rg.Cells(i, 1).Value
Movie.PYear = rg.Cells(i, 2).Value
Movie.PCountry = rg.Cells(i, 3).Value
mcoll.Add Movie
Next i
End Sub
これが Collection とクラスモジュールをうまく組み合わせて使う方法です。この方法をマスターすることで、クラスをより一層便利なものにすることができます。
