t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 自分と同じクラスの新規オブジェクトを返すメソッドを作ってコレクションにスマートに代入する

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に渡した引数でオブジェクトを生成してその結果をそのままコレクションに代入できる。

うん。良い。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。