はじめに
VBAプログラミングを次のレベルに引き上げる強力な機能、それが「クラスモジュール」です。ユーザー定義型(Type
)が、関連するデータ(変数)をまとめる「入れ物」だったのに対し、クラスは、その**データ(プロパティ)に加えて、関連する処理(メソッド)**までをひとまとめにした、より高機能な「部品(オブジェクト)」の設計図となります。
例えば、「商品」というクラスを考えたとき、
- プロパティ(データ): 商品名, 価格, 在庫数
- メソッド(処理):
DisplayInfo
(情報を表示する),UpdateStock
(在庫を更新する)
といったように、データとそれに関連する操作を一つのオブジェクトにカプセル化(内包)できます。これにより、コードが非常に構造化され、再利用性や保守性が飛躍的に向上します。
この記事では、VBAで独自のクラス(カスタムオブジェクト)を作成し、利用するための基本的なステップを解説します。
実装手順の全体像
- クラスモジュールの作成: オブジェクトの設計図となるクラスを作成し、プロパティとメソッドを定義します。
- 標準モジュールの作成: 作成したクラスの「実体(インスタンス)」を生成し、そのプロパティやメソッドを利用するコードを記述します。
ステップ1: クラスモジュールを作成する
まず、オブジェクトの設計図となるクラスを作成します。
- VBEで「挿入」→「クラスモジュール」を選択します。
- 表示されたクラスモジュールのプロパティウィンドウで、
(Name)
をClsEmployee
に変更します。 - 以下のコードを貼り付けます。
クラスモジュール: ClsEmployee
のコード
' --- プライベート変数(クラス内部でのみアクセス可能) ---
' オブジェクトのデータを保持するための変数
Private p_EmployeeID As String
Private p_FullName As String
' --- プロパティ(クラスの外部からデータにアクセスするための窓口) ---
' EmployeeIDプロパティ(書き込み専用)
Public Property Let EmployeeID(value As String)
p_EmployeeID = value
End Property
' FullNameプロパティ(書き込み専用)
Public Property Let FullName(value As String)
p_FullName = value
End Property
' --- メソッド(オブジェクトが実行できる処理) ---
' 情報を表示するメソッド
Public Sub DisplayInfo()
MsgBox "社員ID: " & p_EmployeeID & vbCrLf & _
"氏名: " & p_FullName, vbInformation, "社員情報"
End Sub
ステップ2: 標準モジュールでクラスを利用する
次に、作成した ClsEmployee
クラスのオブジェクトを実際に生成し、利用するコードを標準モジュールに記述します。
標準モジュール: Module1
のコード
Sub UseCustomClass()
' 1. 作成したクラスの型で変数を宣言
Dim emp As ClsEmployee
' 2. Newキーワードで、クラスから新しいオブジェクト(インスタンス)を生成
Set emp = New ClsEmployee
' 3. オブジェクトのプロパティに値を設定
emp.EmployeeID = "EMP-101"
emp.FullName = "佐藤 一郎"
' 4. オブジェクトのメソッドを呼び出す
emp.DisplayInfo
End Sub
実行結果
UseCustomClass
マクロを実行すると、「社員情報」というタイトルのメッセージボックスに、設定したIDと氏名が表示されます。
コードの解説
クラスモジュール (ClsEmployee
)
Private p_EmployeeID As String
: クラスの内部だけで使うプライベート変数を宣言しています。クラスのデータを安全に保持するために、外部から直接アクセスできないようにPrivate
にするのが一般的です。Public Property Let EmployeeID(...)
: これが「プロパティ」の定義です。外部からemp.EmployeeID = "..."
のように値を書き込むための「入り口(Let
)」を提供します。受け取った値は、プライベート変数p_EmployeeID
に格納されます。値を読み取るための「出口(Get
)」も定義できます。Public Sub DisplayInfo()
: これが「メソッド」の定義です。クラスが持つデータ(プライベート変数)を使って、何らかの処理を実行します。
標準モジュール (Module1
)
Dim emp As ClsEmployee
: 自作したクラスClsEmployee
を、String
やRange
と同じようにデータ型として使って変数を宣言しています。Set emp = New ClsEmployee
: この一行が、クラスという「設計図」から、emp
という名前の具体的な「オブジェクト(インスタンス)」をメモリ上に生成する命令です。New
キーワードが使われます。emp.EmployeeID = "EMP-101"
:Property Let
で定義したプロパティを使って、オブジェクトの内部データに値を設定しています。emp.DisplayInfo
:Public Sub
で定義したメソッドを呼び出し、オブジェクトに処理を実行させています。
まとめ
今回は、VBAのクラスモジュールを使って、独自のオブジェクトを作成する基本を解説しました。
- クラスモジュールで、オブジェクトの**プロパティ(データ)とメソッド(処理)**を定義する。
- 標準モジュールで、
New
キーワードを使ってクラスからオブジェクト(インスタンス)を生成する。 - 生成したオブジェクトのプロパティやメソッドを
.
(ドット) で呼び出して利用する。
クラスを使いこなすことは、本格的なオブジェクト指向プログラミングへの入り口です。最初は少し複雑に感じるかもしれませんが、コードを部品化し、再利用性と保守性を飛躍的に向上させるための非常に強力な武器となります。