【VBA】クラスにメソッド(Sub/Function)を定義する方法

目次

はじめに

VBAのクラスモジュールは、データ(プロパティ)と、そのデータを操作するための処理(メソッド)をひとまとめにした「オブジェクト」の設計図です。プロパティがオブジェクトの「状態」を表すのに対し、メソッドはオブジェクトの「振る舞い」を定義します。

例えば、「商品」オブジェクトがあれば、

  • プロパティ: Name, Price (商品名や価格といったデータ)
  • メソッド: ApplyDiscount(割引を適用する), GetInfoText(情報を文字列で取得する)

といったように、データとそれに関連する操作をカプセル化(内包)できます。

この記事では、クラスモジュール内に Public SubPublic Function を使って、独自のメソッドを定義し、利用する方法を解説します。


クラスにメソッドを定義するVBAサンプルコード

この例では、ClsInventory という商品在庫を表すクラスを作成し、在庫を追加するメソッドと、現在の在庫状況を文字列で返すメソッドを実装します。

ステップ1: クラスモジュールを作成する

  1. VBEで「挿入」→「クラスモジュール」を選択します。
  2. プロパティウィンドウで (Name)ClsInventory に変更します。
  3. 以下のコードを貼り付けます。

クラスモジュール: 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() のように呼び出され、オブジェクト自身のプロパティ(ItemNameQuantity)を元に、何らかの値を計算・編集し、結果を戻り値として返します
  • Function なので、戻り値を返します。

Me キーワード

クラスモジュール内で Me というキーワードを使うと、そのオブジェクト自身を指します。Me.QuantityClsInventory.Quantity と書くのと似ていますが、コードが実行されているインスタンスそのものを指すため、Me を使うのが一般的で確実です。


まとめ

今回は、VBAクラスに独自のメソッド(振る舞い)を定義する方法を解説しました。

  • クラスモジュール内の Public Sub は、オブジェクトにアクションを実行させるためのメソッドになる。
  • クラスモジュール内の Public Function は、オブジェクトの状態に基づいて値を返すためのメソッドになる。

プロパティ(データ)とメソッド(処理)を適切にクラス内にまとめることで、コードの部品化が進み、他のプログラムからの再利用が容易になります。これは、大規模で複雑なアプリケーションを構築するための、非常に重要な設計思想です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次