VBAではコンストラクターに引数を渡すことができないので、一旦オブジェクトを作ってから値をセットするという二度手間が発生する。
今回はその手間を省くべく、引数をもとにオブジェクトを自己複製するメソッドを作ってみた。
まずクラスモジュールを挿入し、オブジェクト名をPersonに変えておく。
そして、以下のコードを貼り付け。
Public Name As String, BirthDay As Date Property Get Age() As Long Age = DateDiff("yyyy", BirthDay, Date) End Property Property Get Self() As Object Set Self = Me End Property Function CreateNew(name_, birthday_) As Person With New Person .Name = name_ .BirthDay = birthday_ Set CreateNew = .Self End With End Function
このCreateNewメソッドは引数をとることができ、内部で新規インスタンスを生成して返す。
標準モジュールに書くコードは以下のとおり。
Sub 新規Personを返すPersonクラスサンプル() Dim C As Collection: Set C = New Collection With New Person C.Add .CreateNew("山田", #6/9/1975#) C.Add .CreateNew("鈴木", #7/3/1984#) C.Add .CreateNew("佐藤", #8/16/1955#) End With Dim P As Person For Each P In C Debug.Print "氏名:"; P.Name Debug.Print "年齢:"; P.Age Next End Sub
最初のWith New Personで生成されたインスタンスは専らインスタンス生成機として働き、コレクションには追加されない。
コレクションに追加されるのは、CreateNewにより生み出されたインスタンスである。
まるでコンストラクターに引数を渡しているかのように、CreateNewに渡した引数でオブジェクトを生成してその結果をそのままコレクションに代入できる。
うん。良い。