コンストラクタ
コンストラクタは、クラスがインスタンス化されるときに自動的に実行されるメソッドです。VBA のコンストラクタはイベントプロシージャ Class_Initialize で定義します。
Class_Initialize
例として、インスタンス生成と同時にイミディエイトウィンドウに "Hello!" と表示される簡単なクラスを定義してみます。新しいクラスモジュールを挿入して、オブジェクト名を Hello に変えて、以下のコードを書き込んでください。
Public Sub Class_Initialize()
Debug.Print "Hello!"
End Sub
標準モジュールのマクロで Hello クラスをインスタンス化してみます。
Sub Test_Hello()
'変数をHello型で宣言
Dim x As Hello
'Helloオブジェクトを作成
Set x = New Hello
End Sub
プロパティのデフォルト値
コンストラクタを使うと、クラスをインスタンス化するときに、プロパティにデフォルト値を設定することができます (つまり、このクラスから生成されるすべてのオブジェクトが同じ値をもつように設定できます)。
例として、インスタンス化と同時に Name, Sex, Age の各プロパティに値を代入する Person クラスを定義してみます。
'氏名プロパティ
Public Name As String
'性別プロパティ
Public Sex As String
'年齢プロパティ
Public Age As Long
'プロパティのデフォルト値を設定
Public Sub Class_Initialize()
Me.Name = "刑部真理子"
Me.Sex = "女"
Me.Age = 38
End Sub
標準モジュールで Person オブジェクトを生成して、プロパティの値を表示してみます。
Sub Test_Person()
Dim p As Person
'Personクラスのインスタンスを生成
Set p = New Person
'オブジェクトのプロパティを表示
Debug.Print p.Name, p.Sex, p.Age
End Sub
引数を受け取るコンストラクタ
他のオブジェクト指向言語とは異なり、VBA のコンストラクタはインスタンス化するときに、ユーザーから引数を受け取ってプロパティに代入することはできません。一般的な コンストラクタ の代替手段として、次のような Function マクロを定義できます。
Private Function CreatePerson( _
n As String, s As String, a As Long)
Dim x As Person
Set x = New Person
'受け取った引数をプロパティに渡す
With x
.Name = n
.Sex = s
.Age = a
End With
Set CreatePerson = x
End Function
CreatePerson 関数に氏名、性別、年齢を渡して、Personオブジェクトを作成してみます。
Sub CreatePerson_test()
Dim p As Person
Set p = CreatePerson("比留間沙希", "女", 21)
Debug.Print p.Name, p.Sex, p.Age
End Sub