はじめに
VBAのクラスモジュールは、データ(プロパティ)と、そのデータを操作するための処理(メソッド)をひとまとめにした「オブジェクト」の設計図です。プロパティがオブジェクトの「状態」を表すのに対し、メソッドはオブジェクトの「振る舞い」を定義します。
例えば、「商品」オブジェクトがあれば、
- プロパティ:
Name
,Price
(商品名や価格といったデータ) - メソッド:
ApplyDiscount
(割引を適用する),GetInfoText
(情報を文字列で取得する)
といったように、データとそれに関連する操作をカプセル化(内包)できます。
この記事では、クラスモジュール内に Public Sub
と Public Function
を使って、独自のメソッドを定義し、利用する方法を解説します。
クラスにメソッドを定義するVBAサンプルコード
この例では、ClsInventory
という商品在庫を表すクラスを作成し、在庫を追加するメソッドと、現在の在庫状況を文字列で返すメソッドを実装します。
ステップ1: クラスモジュールを作成する
- VBEで「挿入」→「クラスモジュール」を選択します。
- プロパティウィンドウで
(Name)
をClsInventory
に変更します。 - 以下のコードを貼り付けます。
クラスモジュール: ClsInventory
のコード
' --- プロパティ ---
Public ItemName As String
Public Quantity As Long
' --- メソッド (Subプロシージャ) ---
' 在庫数を増やす「アクション」を実行するメソッド
Public Sub AddToStock(ByVal amount As Long)
' 現在の在庫数(Quantity)に、引数で渡された数を加算
Me.Quantity = Me.Quantity + amount
End Sub
' --- メソッド (Functionプロシージャ) ---
' 現在の状態を元に、情報を「値として返す」メソッド
Public Function GetStatusText() As String
GetStatusText = Me.ItemName & " の現在の在庫は " & Me.Quantity & " 個です。"
End Function
ステップ2: 標準モジュールでクラスのメソッドを利用する
次に、作成した ClsInventory
クラスのオブジェクトを実際に生成し、そのメソッドを呼び出すコードを標準モジュールに記述します。
標準モジュール: Module1
のコード
Sub ManageInventory()
' 1. クラスから新しいオブジェクト(インスタンス)を生成
Dim item As New ClsInventory
' 2. オブジェクトのプロパティに初期値を設定
item.ItemName = "A4コピー用紙"
item.Quantity = 100
' 3. Subメソッドを呼び出して、オブジェクトの状態を変更
item.AddToStock 50 ' 在庫を50個追加
' 4. Functionメソッドを呼び出して、オブジェクトの情報を取得
Dim status As String
status = item.GetStatusText()
' 結果をメッセージボックスに表示
MsgBox status, vbInformation, "在庫状況"
End Sub
実行結果
ManageInventory
マクロを実行すると、「A4コピー用紙 の現在の在庫は 150 個です。」というメッセージボックスが表示されます。
コードの解説
Public Sub AddToStock(...)
クラスモジュール内に記述された Public Sub
は、そのクラスのメソッドになります。
- このメソッドは、
item.AddToStock 50
のように呼び出され、オブジェクト自身のプロパティ(Me.Quantity
)の値を変更する「アクション」を実行します。 Sub
なので、戻り値は返しません。
Public Function GetStatusText() As String
クラスモジュール内に記述された Public Function
も、同様にメソッドになります。
- このメソッドは、
status = item.GetStatusText()
のように呼び出され、オブジェクト自身のプロパティ(ItemName
やQuantity
)を元に、何らかの値を計算・編集し、結果を戻り値として返します。 Function
なので、戻り値を返します。
Me
キーワード
クラスモジュール内で Me
というキーワードを使うと、そのオブジェクト自身を指します。Me.Quantity
は ClsInventory.Quantity
と書くのと似ていますが、コードが実行されているインスタンスそのものを指すため、Me
を使うのが一般的で確実です。
まとめ
今回は、VBAクラスに独自のメソッド(振る舞い)を定義する方法を解説しました。
- クラスモジュール内の
Public Sub
は、オブジェクトにアクションを実行させるためのメソッドになる。 - クラスモジュール内の
Public Function
は、オブジェクトの状態に基づいて値を返すためのメソッドになる。
プロパティ(データ)とメソッド(処理)を適切にクラス内にまとめることで、コードの部品化が進み、他のプログラムからの再利用が容易になります。これは、大規模で複雑なアプリケーションを構築するための、非常に重要な設計思想です。