『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

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

【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

コメント