「Excel VBAのクラス」について第10回目は、ワークシートの表データの複数行をまとめて扱う方法についてです。
前回、ワークシート上にある表の1行分のデータをクラスのプロパティに設定しインスタンス化出来るようになりました。今回は、ワークシートの表データから1行だけでなく複数行をまとめて扱う方法について学びましょう (^^)
わかりました。なんだか少し楽しくなってきました。
今回もよろしくお願いしますm(_ _)m
はじめに
前回のワークシートの表データから1行分のクラスを作成する際に使ったデータを再利用していきます。
表の複数行のデータを扱う方法として考えつくのは「配列」「Collectionオブジェクト」「Dictionaryオブジェクト(連想配列)」です。
以前の記事で「Collectionオブジェクト」が要素数の増減に融通が効くので一番扱いやすいという結論に至った経緯があります。詳細はこの記事を参照願います。
というわけで、表の複数行のデータを扱う方法に「Collectionオブジェクト」を使うこととします。コレクションオブジェクトなら、前回作成した表1行分のデータを表すクラスのインスタンスをコレクションに順次追加して、表全体のデータを操作でるようにしたいと思います。
【この記事でわかることは】
・ワークシートの表データ1行分のインスタンスの集合をコレクション化する方法
・Collectionオブジェクトの使い方について
Collectionオブジェクトについて
これから使用する Collectionオブジェクトについて確認しておきましょう。
Collectionオブジェクトを作成する
Collectionオブジェクトを作成するには、Collection型の変数にSetステートメントを使ってNew演算子で空のCollectionオブジェクトを作成(初期化)します。
Dim 変数 As Collection
Set 変数 = New Collection
Collectionオブジェクトのプロパティとメソッド
「Collectionオブジェクト」のメンバー(プロパティとメソッド)は次のとおりです。
メンバー | 説明 |
---|---|
Count プロパティ | 要素の個数(Long)を返します。値の取得のみ可能です。 |
Add メソッド | 要素を追加します。 |
Item メソッド | 要素を返(取得)します。 |
Romove メソッド | 要素を削除します。 |
Add メソッドで要素を追加する
Collectionオブジェクトに要素を追加するには、次の構文でAddメソッドを使用します。
Collection.Add Item, [Key], [Before]or[After]
引数 | 説明 |
---|---|
Collection | 【必須】Collectionオブジェクトの名前です。 |
Item | 【必須】追加する要素を指定します。 ※ 違うデータ型の要素も指定可能です。 |
[Key] | 要素に割り当てるインデックスまたはキー値を指定します。 ※ 既存のキーと重複している場合はエラーになります。 |
[Before] | 指定した要素の「前」に要素を挿入します。 BeforeとAfter両方は指定できません。 |
[After] | 指定した要素の「後」に要素を挿入します。 BeforeとAfter両方は指定できません。 |
※ BeforeとAfterの指定が無い場合は末尾に追加されます。
Item メソッドで要素を取得する
Collectionオブジェクトから要素を取得するには、次の構文でItemメソッドを使用します。
Collection.Item(index または Key)
Itemメソッドは、コレクションの既定メソッドなので「.Item」を省略することが出来ます。
コレクション名に「( )」を付けてインデックス番号またはキー値を指定するだけで呼び出せます。
例えば「.Item」を省略した場合は、次のように指定して要素を取得します。
コレクション名(1) 'インデックス番号1の要素を取得
コレクション名("A") 'キー値"A"の要素を取得
Remove メソッドで要素を削除する
Collectionオブジェクトから要素を削除するには、次の構文でRemoveメソッドを使用します。
Collection.Remove(index または Key)
コレクション名に「.Remove( )」を付けてインデックス番号またはキー値を指定するだけで削除できます。
例えば、次のように指定して要素を削除します。
コレクション名.Remove(1) 'インデックス番号1の要素を削除
コレクション名.Remove("A") 'キー値"A"の要素を削除
※Addメソッドでキーが重複エラーになる場合に、Removeメソッドで要素を削除してから、再度要素をAddメソッドで追加する方法で書き換えることができます。
コレクションとして表データを集合化します
前回使った次の「表」をそのまま使っていきます。
4行目からがデータ部分です。
インスタンスの集合をコレクション化する
インスタンスは1行分のデータです。複数行分のインスタンスをコレクション化して集合させます。
標準モジュールのコード
'標準モジュール
Sub CollectionTest()
Dim owner As Class1 'ownerクラスインスタンス用
Dim mypet As Class1 'mypetクラスインスタンス用
'Worksheetオブジェクト設定
Dim ws As Worksheet: Set ws = Sheet1
'コレクションオブジェクト作成
Dim mycol As Collection: Set mycol = New Collection
Dim i As Long: i = 4 '4行目からデータなので初期化
With ws
Do While .Cells(i, 1).Value <> ""
'ownerとmypetインスタンス作成
Set owner = New Class1
Set mypet = New Class1
'ownerクラスのプロパティ
owner.ID = .Cells(i, 1).Value 'IDに代入
owner.Name = .Cells(i, 2).Value 'Nameに代入
owner.Age = .Cells(i, 3).Value 'Ageに代入
'mypetクラスのプロパティ
mypet.Name = .Cells(i, 4).Value 'mypetのNameに代入
mypet.Age = .Cells(i, 5).Value 'mypetのAgeに代入
mypet.Types = .Cells(i, 6).Value 'Tipesに代入
mypet.Gender = .Cells(i, 7).Value 'Genderに代入
Set owner.Pet = mypet 'owner.Typeにmypetを代入
'コレクションにインスタンスを追加
mycol.Add owner, owner.ID
i = i + 1
Loop
End With
'Item毎の保存データをメッセージで表示して確認
For i = 1 To mycol.Count
With mycol(i)
MsgBox "OWNER:" & .Name & "(" & .Age & "歳)" _
& vbCrLf & "ペット名:" & .Pet.Name & _
"(" & .Pet.Age & "歳)" & .Pet.Types & _
"/" & .Pet.Gender
End With
Next
'不要になったオブジェクトを解放
Set ws = Nothing
Set mycol = Nothing
End Sub
【標準モジュールのコード解説】
・3~4行目で変数「owner」「mypet」をクラス型で定義しています。
・8行目で変数「mycol」にコレクションオブジェクトをNewしています。
・12行目から、Do WhileステートメントでLoop処理を開始しています。1列目のデータが無くなるまでループする設定です。
・14~15行目、ここでownerクラスとmypetクラスをNewしています。このタイミング(ループ処理開始時)にNewするのはItem毎に初期化しないとデータが上書きされてしまうためです。
・27行目で、コレクションにAddメソッドでインスタンスを追加しています。
・32~39行目は、コレクションに追加されたインスタンスの各プロパティ値が正しいかどうかを確認するためのメッセージを表示させています。
・41~42行目で、不要になったオブジェクトを開放しています。
※ コレクションオブジェクトを開放するとインスタンスも解放されます。
【実行時のメッセージ動画】⇒
コレクションにインスタンスが追加された後に、Item毎のデータを取得してメッセージボックスで表示させている動画です。
追加したインスタンス毎にプロパティ値がコレクションされていることが確認できます。
ローカルウインドウでコレクションを確認します
ローカルウィンドウでコレクション「myCol」の内容を確認することができます。
※ VBEメニューから表示(V)→ローカルウィンドウ(S)クリックで表示できます。
コレクション「myCol」の各Itemにうまく値が取得出来ていることを確認できます。
クラスモジュールに設定したコード
クラスモジュール側のコードです。Petプロパティにmypetクラスを代入させています。
'クラス内変数はPrivateで宣言
Private sID As String
Private sName As String
Private iAge As Integer
Private sTypes As String
Private sGender As String
Private cPet As Class1
'ID(ID)プロパティ取得
Public Property Get ID() As String
ID = sID
End Property
'名前(Name)プロパティ設定
Public Property Let ID(ByVal IDValue As String)
sID = IDValue
End Property
'名前(Name)プロパティ取得
Public Property Get Name() As String
Name = sName
End Property
'名前(Name)プロパティ設定
Public Property Let Name(ByVal nameValue As String)
sName = nameValue
End Property
'年齢(Age)プロパティ取得
Public Property Get Age() As Integer
Age = iAge
End Property
'年齢(Age)プロパティ設定
Public Property Let Age(ByVal ageValue As Integer)
iAge = ageValue
End Property
'ペット種類(Types)プロパティ取得
Public Property Get Types() As String
Types = sTypes
End Property
'ペット種類(Types)プロパティ設定
Public Property Let Types(ByVal typesValue As String)
sTypes = typesValue
End Property
'ペット性別(Gender)プロパティ取得
Public Property Get Gender() As String
Gender = sGender
End Property
'ペット性別(Gender)プロパティ設定
Public Property Let Gender(ByVal genderValue As String)
sGender = genderValue
End Property
'Petプロパティ取得
Public Property Get Pet() As Class1
Set Pet = cPet
End Property
'Petプロパティ設定
Public Property Set Pet(ByVal petValue As Class1)
Set cPet = petValue
End Property
【クラスモジュールのコード解説】
・2~7行目、クラス内で使用する変数をPrivateで定義しています。
・10~48行目までは各プロパティの設定です。
・54~56行、Property Set Pet で変数 cPet に(引数の)myPetクラスを設定します。
・50~52行目、Property Get Pet で名前(Pet)プロパティの値cPetを取得します。
オブジェクトブラウザーでメンバーを確認
オブジェクトブラウザーを開いて確認してみましょう。(F2キー押下で表示できます)
各プロパティとクラスモジュール内のPrivate変数がメンバーに表示されているのを確認できます。
まとめ(おわりに)
以上、Excel VBAでシートの表データから作成したクラスインスタンスの集合をコレクション化する方法でした。
クラスの10回目でした。
前回作成した表1行分のインスタンスをコレクションオブジェクトで集合させることが出来ました。これで表全体をコレクション化するイメージはつかめたと思います。
はい、CollectionオブジェクトのAddメソッドで要素を追加していくんですね。
ループ処理で追加していくイメージは大体つかめました(^^)
コレクション化されたインスタンスを取り出す方法などについては別途勉強します。
次回は、クラスをNewする際に実行されるコンストラクタについて勉強しましょう(^^)/
わかりました。次回もよろしくお願いしますm(_ _)m
まとめ
最後に、今回勉強した内容を整理しておきます。
次回の予定は、VBAのクラスをNewする際に実行されるコンストラクタについて勉強しておきたいと思います。よろしければ引き続き次もご覧いただければ幸いです。
Excel VBA クラスについての記事一覧
★★★ ランキング参加中! クリックしてね(^^)/ ★★★
過去記事のサンプルファイルをダウンロードできます
この記事のサンプル登録はありません。記事内のコードをご利用ください。
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください