Excel VBA は手続き型のプログラミング言語ですが、オブジェクト指向の概念も一部取り入れることができます。オブジェクト指向を活用することで、コードの再利用性・保守性・拡張性を向上 させることができます。
本記事では、Excel VBA におけるオブジェクト指向の基本概念と、その実践方法 について詳しく解説します。
目次
オブジェクト指向とは?
オブジェクト指向(Object-Oriented Programming, OOP) とは、オブジェクト(データと処理をまとめたもの)を基にプログラムを設計する手法 です。主な概念には以下のようなものがあります。
| 概念 | 説明 |
|---|---|
| クラス(Class) | オブジェクトの設計図(データ構造とメソッドを定義) |
| オブジェクト(Object) | クラスから生成された実体 |
| プロパティ(Property) | オブジェクトの属性(データ) |
| メソッド(Method) | オブジェクトが実行できる処理(関数) |
| カプセル化(Encapsulation) | データを隠し、適切な方法でアクセスする仕組み |
| 継承(Inheritance) | 既存のクラスを基に新しいクラスを作成 |
| ポリモーフィズム(Polymorphism) | 同じメソッド名で異なる動作をさせる |
VBA では、クラスモジュール(Class Module) を使うことで、オブジェクト指向プログラミングを実践できます。
Excel VBA におけるオブジェクト指向の活用
・クラスを使わない従来の VBA コード
通常の VBA コードでは、オブジェクト指向を意識せずに手続き型のアプローチを取ります。
Sub WithoutObjectOriented()
Dim name As String
Dim age As Integer
name = "田中"
age = 30
MsgBox "名前: " & name & vbCrLf & "年齢: " & age
End Sub
この方法では、データ(name と age)が分離しており、関連する処理をまとめることができません。
・クラスモジュールを使用してオブジェクト指向を適用
クラスを作成し、データと処理をまとめることで、オブジェクト指向を実践できます。
1. クラスの作成
- VBA エディタで「挿入」→「クラスモジュール」を追加
- クラスの名前を
Personに変更 - 以下のコードを
Personクラスに記述
' Person クラス
Option Explicit
Private pName As String
Private pAge As Integer
' プロパティ: 名前
Public Property Get Name() As String
Name = pName
End Property
Public Property Let Name(value As String)
pName = value
End Property
' プロパティ: 年齢
Public Property Get Age() As Integer
Age = pAge
End Property
Public Property Let Age(value As Integer)
pAge = value
End Property
' メソッド: 情報を表示
Public Sub ShowInfo()
MsgBox "名前: " & pName & vbCrLf & "年齢: " & pAge
End Sub
2. クラスを利用するコード
標準モジュールに以下のコードを記述し、Person クラスを利用します。
Sub UsePersonClass()
Dim p As Person
Set p = New Person
p.Name = "田中"
p.Age = 30
p.ShowInfo ' メソッドの呼び出し
End Sub
メリット
✅ Person クラスを作成することで、関連データを一元管理 できる
✅ クラスを使うことで、再利用性と保守性が向上 する
クラスの応用例
住所録管理クラス
クラスを利用すると、複数のオブジェクトを管理しやすくなります。
1. Address クラスの作成
Option Explicit
Private pName As String
Private pAddress As String
' プロパティ: 名前
Public Property Get Name() As String
Name = pName
End Property
Public Property Let Name(value As String)
pName = value
End Property
' プロパティ: 住所
Public Property Get Address() As String
Address = pAddress
End Property
Public Property Let Address(value As String)
pAddress = value
End Property
' メソッド: 情報を表示
Public Sub ShowInfo()
MsgBox "名前: " & pName & vbCrLf & "住所: " & pAddress
End Sub
2. クラスを活用するコード
Sub UseAddressClass()
Dim person1 As Address
Dim person2 As Address
' オブジェクトのインスタンスを作成
Set person1 = New Address
Set person2 = New Address
' データをセット
person1.Name = "佐藤"
person1.Address = "東京都"
person2.Name = "鈴木"
person2.Address = "大阪府"
' 情報を表示
person1.ShowInfo
person2.ShowInfo
End Sub
メリット
- クラスを使用することで データ管理が容易
- インスタンスごとに異なるデータを格納可能
Excel VBA におけるオブジェクト指向の注意点
- VBA は完全なオブジェクト指向言語ではない
- 継承(Inheritance) がサポートされていない
- ポリモーフィズム(Polymorphism) も直接的には使用不可
- オブジェクトの破棄
Set オブジェクト = Nothingを使用して、不要になったオブジェクトを解放するSet person1 = Nothing
Set person2 = Nothing
- パフォーマンス
- クラスモジュールを多用すると 処理速度が遅くなる可能性 あり
- 大量データ処理の場合は、配列や
Collectionを活用するのも選択肢
まとめ
オブジェクト指向のメリット
✅ データと処理を一元管理 できる
✅ コードの再利用性・保守性が向上
✅ 大規模なプログラムでも整理しやすい
Excel VBA での実践方法
- クラスモジュールを作成
- プロパティを定義
- メソッドを定義
- 標準モジュールでクラスをインスタンス化し、活用