本ページには広告が含まれています。

Excel VBA クラス インスタンスをコレクション化(Lv.10)

Excel VBA クラス インスタンスの集合をコレクション化
画像はCanva「Text to Image」で生成しました

「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]指定した要素の「」に要素を挿入します。
BeforeAfter両方は指定できません。
[After]指定した要素の「」に要素を挿入します。
BeforeAfter両方は指定できません。
※ [ ]は省略可能です。
BeforeAfterの指定が無い場合は末尾に追加されます。

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

まとめ

最後に、今回勉強した内容を整理しておきます。

【インスタンスの集合をコレクション化する方法】

CollectionオブジェクトのAddメソッドでコレクションにインスタンス(表1行分)を追加して集合化します。

インスタンス作成は都度初期化する必要があるので、ループ処理開始時にインスタンスをNewする必要があります。

次回の予定は、VBAのクラスをNewする際に実行されるコンストラクタについて勉強しておきたいと思います。よろしければ引き続き次もご覧いただければ幸いです。

Excel VBA クラスについての記事一覧

Excel VBA クラスの作成・使い方について(Lv.1)
Excel VBA クラスのプロパティ設定について(Lv.2)
Excel VBA クラスにメソッドを設定する方法(Lv.3)
Excel VBA クラスをインスタンス化する方法(Lv.4)
Excel VBA クラス Propertyプロシージャ(Lv.5)
Excel VBA クラス Property Getプロシージャ(Lv.6)
Excel VBA クラス Property Letプロシージャ(Lv.7)
Excel VBA クラス Property Setプロシージャ(Lv.8)
Excel VBA シートの表データからクラスを作成 (Lv.9)
Excel VBA クラス インスタンスをコレクション化(Lv.10)
Excel VBA クラス コンストラクタとデストラクタ(Lv.11)
Excel VBA クラス コンストラクタを利用する方法(Lv.12)
Excel VBA クラス コレクションの要素取得方法(Lv.13)
Excel VBA クラス コレクション要素の追加と削除(Lv.14)
Excel VBA クラス コレクションの内容を書き出す(Lv.15)
Excel VBA クラス UserFormで機能を操作する(Lv.16)
Excel VBA クラス コレクションの最大要素数について(Lv.17)

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

スポンサーリンク

過去記事のサンプルファイルをダウンロードできます

この記事のサンプル登録はありません。記事内のコードをご利用ください。

過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください