【VBA】コンストラクタの定義
コンストラクタは、クラスがインスタンス化されるときに自動的に実行されるメソッドです。VBA のコンストラクタはイベントプロシージャ Class_Initialize で定義します。
Class_Initialize
例として、インスタンス生成と同時にイミディエイトウィンドウに “Hello!” と表示される簡単なクラスを定義してみます。新しいクラスモジュールを挿入して、オブジェクト名を Hello に変えて、以下のコードを書き込んでください。
'[VBA] Constructor(1) 'Helloクラスの定義 Public Sub Class_Initialize() Debug.Print "Hello!" End Sub
標準モジュールのマクロで Hello クラスをインスタンス化してみます。
'[VBA] Constructor(2) 'Helloクラスをインスタンス化するマクロ Sub Test_Hello() '変数をHello型で宣言 Dim x As Hello 'Helloオブジェクトを作成 Set x = New Hello End Sub '実行結果:Hello!
プロパティのデフォルト値
コンストラクタを使うと、クラスをインスタンス化するときに、プロパティにデフォルト値を設定することができます (つまり、このクラスから生成されるすべてのオブジェクトが同じ値をもつように設定できます)。
例として、インスタンス化と同時に Name, Sex, Age の各プロパティに値を代入する Person クラスを定義してみます。
'[VBA] Constructor(3) 'Pesronクラスの定義 '氏名プロパティ 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 オブジェクトを生成して、プロパティの値を表示してみます。
'[VBA] Constructor(4) 'Personクラスのインスタンス化マクロ Sub Test_Person() Dim p As Person 'Personクラスのインスタンスを生成 Set p = New Person 'オブジェクトのプロパティを表示 Debug.Print p.Name, p.Sex, p.Age End Sub '実行結果:刑部真理子 女 38
引数を受け取るコンストラクタ
他のオブジェクト指向言語とは異なり、VBA のコンストラクタはインスタンス化するときに、ユーザーから引数を受け取ってプロパティに代入することはできません。一般的なコンストラクタの代替手段として、次のような Function マクロを定義できます。
'[VBA] Constructor(5) 'Personクラスのコンストラクタ関数 Private Function Create_Person( _ 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 Create_Person = x End Function
Create_Person() に氏名、性別、年齢を渡して、Personオブジェクトを作成してみます。
'[VBA] Constructor(6) 'Create_Personのテストマクロ Sub Create_Person_test() Dim p As Person Set p = Create_Person("比留間沙希", "女", 21) Debug.Print p.Name, p.Sex, p.Age End Sub '実行結果:比留間沙希 女 21
コメント
AIがClass_Initializeについて解説します
VBAのClass_Initializeは、クラスモジュール内に存在する特別なイベントプロシージャです。このプロシージャは、クラスの新しいインスタンスが作成される際に自動的に呼び出されます。Class_Initializeプロシージャは、クラスの初期化処理を行うために使用されます。例えば、クラスのプロパティや変数の初期値を設定したり、他の初期化操作を実行したりすることができます。以下に、Class_Initializeプロシージャの基本的な構文を示します:
Class_Initializeプロシージャは、クラスのインスタンスが作成される際に一度だけ呼び出されます。そのため、このプロシージャ内で行われる処理は、インスタンスごとに異なる初期化を行うために利用されます。なお、Class_Initializeプロシージャは必須ではありません。クラス内で特別な初期化処理が必要ない場合は、省略することもできます。