【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
Excel VBA
Excel VBA 表計算とプログラミング学習サイト

コメント

タイトルとURLをコピーしました