VBAを学習していると、
- VBAはオブジェクト指向なのか?
- VBAでもクラスは作れるのか?
- JavaやC#と同じような設計はできるのか?
といった疑問を持つことがあります。
VBAは完全なオブジェクト指向言語ではありませんが、オブジェクト指向の考え方を取り入れたプログラミングを行うことができます。
この記事では、VBAにおけるオブジェクト指向の立ち位置と、実際にできること・できないことについて解説します。
1. VBAはオブジェクト指向なのか?
結論から言うと、
VBAはオブジェクト指向を一部サポートしている言語です。
VBAには、
- オブジェクト
- クラスモジュール
- プロパティ
- メソッド
といったオブジェクト指向の基本機能が備わっています。
例えば、普段使用している次のコードもオブジェクトを操作しています。
Worksheets("Sheet1").Range("A1").Value = "Hello"
このコードでは、
- Worksheets
- Range
- Value
といったオブジェクトやプロパティを利用しています。
つまり、VBAはExcelのオブジェクトを操作することを前提に作られた言語なのです。
2. VBAでできるオブジェクト指向
VBAでは、クラスモジュールを利用することで独自のオブジェクトを作成できます。
例えば、「社員」を表現するクラスを考えてみます。
Private pName As String
Private pAge As Integer
このようにデータを保持できます。
さらに、
Public Sub DisplayInfo()
MsgBox pName
End Sub
のような処理も持たせることができます。
オブジェクト指向では、
データと処理を1つのまとまりとして管理する
ことが特徴です。
3. VBAでできること
クラスの作成
クラスモジュールを利用して独自オブジェクトを作成できます。
例えば、
- 社員
- 商品
- 顧客
- 注文
などをオブジェクトとして管理できます。
プロパティの定義
Property GetやProperty Letを利用してデータの取得や設定を行えます。
Private pName As String
Public Property Get Name() As String
Name = pName
End Property
Public Property Let Name(ByVal Value As String)
pName = Value
End Property
利用例
emp.Name = "田中"
メソッドの定義
クラス内に処理を持たせることができます。
Public Sub DisplayInfo()
MsgBox Name
End Sub
利用例
emp.DisplayInfo
カプセル化
データを隠蔽し、安全に操作できるようにできます。
Private pSalary As Long
Privateで宣言したデータは外部から直接アクセスできません。
必要な操作だけを公開することで、意図しない変更を防げます。
4. VBAでできないこと
継承
VBAには継承機能がありません。
例えばJavaやC#では、
動物
├ 犬
├ 猫
└ 鳥
のように親クラスの機能を子クラスへ引き継ぐことができます。
しかしVBAでは、このようなクラス階層を作ることはできません。
自由なコンストラクタ
VBAではコンストラクタを自由に定義できません。
代わりに使用するのが、
Class_Initialize
です。
Private Sub Class_Initialize()
pName = ""
End Sub
ただし、他言語のように引数を受け取ることはできません。
本格的なポリモーフィズム
VBAでもインターフェースを利用した設計は可能ですが、JavaやC#ほど柔軟ではありません。
そのため、本格的なオブジェクト指向設計を行うには限界があります。
5. VBAでオブジェクト指向を使うメリット
オブジェクト指向を利用すると、関連するデータと処理をまとめて管理できます。
例えば顧客情報なら、
Customer.Name
Customer.Address
Customer.Phone
のように整理できます。
また、
- コードの見通しが良くなる
- 再利用しやすくなる
- 保守しやすくなる
といったメリットがあります。
特にコード量が増えるほど効果を発揮します。
6. VBAでオブジェクト指向を学ぶべきか?
簡単なマクロであれば、クラスモジュールを使わなくても十分です。
しかし、
- 大量のデータを扱う
- 複雑な業務ロジックを扱う
- 同じデータ構造を繰り返し利用する
といった場合には、クラスモジュールによるオブジェクト指向設計が役立ちます。
まずは、
の3つを理解することから始めるとよいでしょう。
7. まとめ
VBAは完全なオブジェクト指向言語ではありませんが、オブジェクト指向の考え方を利用した開発が可能です。
VBAでできることは、
- クラスの作成
- オブジェクトの生成
- プロパティの定義
- メソッドの定義
- カプセル化
です。
一方で、
- 継承
- 自由なコンストラクタ
- 本格的なポリモーフィズム
などは利用できません。
そのためVBAは、
「オブジェクト指向を一部サポートした言語」
と考えるのが適切です。
まずはExcelのオブジェクト構造を理解し、その後クラスモジュールを活用することで、より整理された保守しやすいコードを書けるようになります。
コメント