[VBA] Class_Initialize でコンストラクタを定義します

コンストラクタ

 コンストラクタは、クラスがインスタンス化されるときに自動的に実行されるメソッドです。VBA のコンストラクタはイベントプロシージャ Class_Initialize で定義します。

Class_Initialize

 例として、インスタンス生成と同時にイミディエイトウィンドウに "Hello!" と表示される簡単なクラスを定義してみます。新しいクラスモジュールを挿入して、オブジェクト名を Hello に変えて、以下のコードを書き込んでください。

'Helloクラスの定義
Public Sub Class_Initialize()
 Debug.Print "Hello!"
End Sub

 標準モジュールのマクロで Hello クラスをインスタンス化してみます。

'Helloクラスをインスタンス化するマクロ
Sub Test_Hello()

 '変数をHello型で宣言
 Dim x As Hello

 'Helloオブジェクトを作成
 Set x = New Hello

End Sub

Hello!

 

プロパティのデフォルト値

 コンストラクタを使うと、クラスをインスタンス化するときに、プロパティにデフォルト値を設定することができます (つまり、このクラスから生成されるすべてのオブジェクトが同じ値をもつように設定できます)。

 例として、インスタンス化と同時に Name, Sex, Age の各プロパティに値を代入する Person クラスを定義してみます。

'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 オブジェクトを生成して、プロパティの値を表示してみます。

'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 マクロを定義できます。

'Personクラスのコンストラクタ関数
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オブジェクトを作成してみます。

'CreatePersonのテストマクロ
Sub CreatePerson_test()

 Dim p As Person

 Set p = CreatePerson("比留間沙希", "女", 21)

 Debug.Print p.Name, p.Sex, p.Age

End Sub

比留間沙希 女 21
関連コンテンツ

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください