はじめに
VBAのクラスモジュールを使って独自のオブジェクトを作成する際、オブジェクトが生成された(New
された)瞬間に、プロパティの初期値を設定したり、何らかの準備処理を自動で実行したりしたい場合があります。
例えば、「商品」オブジェクトを作成した瞬間に、在庫数をデフォルトで 0
に設定しておく、といった処理です。
このような「オブジェクトが生まれた瞬間の初期化処理」を定義するために、VBAのクラスモジュールには Class_Initialize
という特別なイベントプロシージャが用意されています。これは、他のプログラミング言語における「コンストラクタ」に相当する機能です。
この記事では、Class_Initialize
イベントを使って、クラスの初期化処理をスマートに実装する方法を解説します。
Class_Initialize
を使ったVBAサンプルコード
この例では、ClsUserProfile
というユーザー情報を扱うクラスを作成し、オブジェクトが生成された瞬間に、RegisterDate
(登録日)プロパティに現在の日時が自動でセットされるようにします。
ステップ1: クラスモジュールを作成する
- VBEで「挿入」→「クラスモジュール」を選択します。
- プロパティウィンドウで
(Name)
をClsUserProfile
に変更します。 - 以下のコードを貼り付けます。
クラスモジュール: ClsUserProfile
のコード
' --- プロパティ ---
Public UserName As String
Public RegisterDate As Date
' --- 初期化イベント ---
' オブジェクトが New された瞬間に自動的に実行される
Private Sub Class_Initialize()
' プロパティの初期値を設定
Me.UserName = "(未設定)"
Me.RegisterDate = Now() ' 現在の日時を自動で設定
' 初期化されたことをイミディエイトウィンドウに出力して確認
Debug.Print "ClsUserProfile オブジェクトが初期化されました。"
End Sub
' --- メソッド ---
' 情報を文字列で返すメソッド
Public Function GetInfo() As String
GetInfo = "ユーザー名: " & Me.UserName & ", 登録日時: " & Me.RegisterDate
End Function
ステップ2: 標準モジュールでクラスを利用する
次に、作成した ClsUserProfile
クラスのオブジェクトを生成し、初期化が自動で行われることを確認します。
標準モジュール: Module1
のコード
Sub CreateUser()
Debug.Print "これからオブジェクトを生成します..."
' Newキーワードで、新しいオブジェクト(インスタンス)を生成
' この瞬間に、ClsUserProfile の Class_Initialize が実行される
Dim user As New ClsUserProfile
Debug.Print "オブジェクトが生成されました。"
' 初期化イベントで設定されたデフォルト値を表示
Debug.Print user.GetInfo()
' プロパティに新しい値を設定
user.UserName = "田中 宏"
' 変更後の情報を表示
Debug.Print user.GetInfo()
End Sub
実行結果
CreateUser
マクロを実行すると、VBEのイミディエイトウィンドウ(Ctrl+G
で表示)に以下のように出力されます。
これからオブジェクトを生成します...
ClsUserProfile オブジェクトが初期化されました。
オブジェクトが生成されました。
ユーザー名: (未設定), 登録日時: 2025/08/17 8:41:22
ユーザー名: 田中 宏, 登録日時: 2025/08/17 8:41:22
New ClsUserProfile
の行で、Class_Initialize
内の Debug.Print
が実行されていること、そして生成直後のオブジェクトの UserName
と RegisterDate
に初期値が設定されていることが確認できます。
コードの解説
Private Sub Class_Initialize()
これは特別な名前のイベントプロシージャです。クラスモジュールの上部にあるドロップダウンから (General)
を Class
に、右側のドロップダウンで Initialize
を選ぶことでも生成できます。
この Sub
の中に書かれたコードは、そのクラスのオブジェクトが Dim obj As New ...
や Set obj = New ...
によってメモリ上に生成された瞬間に、一度だけ自動的に実行されます。
引数を取ることができないため、外部から初期化のための値を渡すことはできません。値を渡したい場合は、別途 Init
のような初期化用のメソッドを自分で作成する必要があります。
まとめ
今回は、VBAクラスの Class_Initialize
イベントを使って、オブジェクト生成時に初期化処理を自動実行する方法を解説しました。
Class_Initialize
は、オブジェクトがNew
されたときに自動で実行される特別なイベントプロシージャ。- プロパティのデフォルト値を設定したり、オブジェクトが利用可能になる前の準備処理を行ったりするのに最適。
- 他の言語における「コンストラクタ」と同様の役割を果たす。
Class_Initialize
を活用することで、オブジェクトが必ず適切な初期状態から始まることを保証でき、より安全で信頼性の高いプログラムを構築することができます。