はじめに:VBAにも「オブジェクト指向」はある
Excel VBAと聞くと、「セルを操作するための簡易スクリプト」というイメージを持つ方が多いかもしれません。しかし、VBAにはれっきとした「オブジェクト指向プログラミング(OOP)」の要素があります。
その中核を担うのが「クラスモジュール」です。
本記事では、VBAでクラスモジュールを使いこなすための基礎と、実務での活用方法をわかりやすく解説します。
クラスモジュールとは?標準モジュールとの違い
標準モジュールとの違い
項目 | 標準モジュール | クラスモジュール |
---|---|---|
定義内容 | 関数やプロシージャ(Subなど) | オブジェクト(プロパティ・メソッド) |
インスタンス化 | 不要(そのまま呼び出し) | 必要(Newキーワードで生成) |
使い所 | 共通処理のまとめ | 状態と動作をセットにした設計が必要な場面 |
クラスモジュールの定義方法
- VBAエディターで「挿入」→「クラスモジュール」を選択
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
の構文に慣れよう- クラス内でメソッドも定義して「動きのあるオブジェクト」にしよう
- 必要に応じて
Collection
やDictionary
と組み合わせて使おう
まとめ:VBAでも“オブジェクト指向”は武器になる
Excel VBAでも、クラスモジュールを活用することで次のような恩恵が得られます。
- 大規模マクロでも保守性が高い
- データと処理をひとまとめにできる
- チーム開発や転職時のスキル証明にもつながる
「ただ動けばいいマクロ」から一歩進んで、「読みやすくて再利用しやすいマクロ」を書くために、ぜひクラスモジュールを活用してみてください。