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

コンストラクタ

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

Class_Initialize

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

'VBA Constructor sample_code_1-1

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

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

'VBA Constructor sample_code_1-2

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

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

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

End Sub

Hello!

 

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

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

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

'VBA Constructor sample_code_2-1

'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 sample_code_2-2

'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 sample_code_3-1

'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 sample_code_3-2

'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

コメントをどうぞ

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

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