VBAのクラスモジュールとは? オブジェクト指向で書くExcelマクロ超入門

はじめに:VBAにも「オブジェクト指向」はある

Excel VBAと聞くと、「セルを操作するための簡易スクリプト」というイメージを持つ方が多いかもしれません。しかし、VBAにはれっきとした「オブジェクト指向プログラミング(OOP)」の要素があります。

その中核を担うのが「クラスモジュール」です。

本記事では、VBAでクラスモジュールを使いこなすための基礎と、実務での活用方法をわかりやすく解説します。


クラスモジュールとは?標準モジュールとの違い

標準モジュールとの違い

項目標準モジュールクラスモジュール
定義内容関数やプロシージャ(Subなど)オブジェクト(プロパティ・メソッド)
インスタンス化不要(そのまま呼び出し)必要(Newキーワードで生成)
使い所共通処理のまとめ状態と動作をセットにした設計が必要な場面

クラスモジュールの定義方法

  1. VBAエディターで「挿入」→「クラスモジュール」を選択
  2. Name プロパティでクラス名(例:Person)を設定

基本例:Personクラスを作ってみよう

' クラスモジュール名: Person

Private pName As String
Private pAge As Integer

Public Property Get Name() As String
    Name = pName
End Property

Public Property Let Name(ByVal value As String)
    pName = value
End Property

Public Property Get Age() As Integer
    Age = pAge
End Property

Public Property Let Age(ByVal value As Integer)
    pAge = value
End Property

Public Sub ShowInfo()
    MsgBox "名前: " & pName & ", 年齢: " & pAge
End Sub

呼び出し側(標準モジュール)

Sub SampleUse()
    Dim user As New Person
    user.Name = "田中"
    user.Age = 30
    user.ShowInfo
End Sub

クラスを使うメリット:可読性と保守性の向上

✅ 複数の関連情報をひとまとめにできる

→ 例えば「顧客」や「商品」などの情報をクラスで表現すると、データと操作をセットで扱えるようになります。

✅ 似た処理を再利用しやすい

→ 同じような構造のデータを複数扱う場面(一覧表示・検索など)で便利。

✅ Excelの表との親和性も高い

→ セルの内容を読み込んでクラスに変換 → 加工して再出力、のような処理が柔軟に。


実務例:Excelシートの「顧客情報」をオブジェクトで扱う

顧客クラス(Customer)

' クラスモジュール名: Customer

Private pID As String
Private pName As String
Private pEmail As String

Public Property Get ID() As String: ID = pID: End Property
Public Property Let ID(ByVal value As String): pID = value: End Property

Public Property Get Name() As String: Name = pName: End Property
Public Property Let Name(ByVal value As String): pName = value: End Property

Public Property Get Email() As String: Email = pEmail: End Property
Public Property Let Email(ByVal value As String): pEmail = value: End Property

標準モジュールでの処理

Sub ReadCustomers()
    Dim customers() As Customer
    Dim i As Long, lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    ReDim customers(1 To lastRow - 1)
    
    For i = 2 To lastRow
        Dim c As New Customer
        c.ID = Cells(i, 1).Value
        c.Name = Cells(i, 2).Value
        c.Email = Cells(i, 3).Value
        Set customers(i - 1) = c
    Next i
    
    MsgBox "読み込み完了:" & UBound(customers) & "件"
End Sub

クラスをマスターするためのヒント

  • Property Get / Let の構文に慣れよう
  • クラス内でメソッドも定義して「動きのあるオブジェクト」にしよう
  • 必要に応じて CollectionDictionary と組み合わせて使おう

まとめ:VBAでも“オブジェクト指向”は武器になる

Excel VBAでも、クラスモジュールを活用することで次のような恩恵が得られます。

  • 大規模マクロでも保守性が高い
  • データと処理をひとまとめにできる
  • チーム開発や転職時のスキル証明にもつながる

「ただ動けばいいマクロ」から一歩進んで、「読みやすくて再利用しやすいマクロ」を書くために、ぜひクラスモジュールを活用してみてください。


関連記事

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