目次
はじめに
VBAで自作のクラス(オブジェクト)を複数扱う際、それらを配列や標準の Collection
オブジェクトで管理することが多いですが、いくつか不便な点があります。
- 配列:
ReDim Preserve
でのサイズ変更が少し面倒。 - 標準
Collection
: どんな種類のオブジェクトでも追加できてしまうため、型安全性が低い。
これらの課題を解決し、より堅牢で使いやすいオブジェクトの管理を実現するのが「カスタムコレクションクラス」です。これは、「自作オブジェクトを管理するためだけの、専用のクラス」を作成する、高度なオブジェクト指向のテクニックです。
この記事では、2つのクラスモジュールを使い、独自のコレクションクラスを作成する本格的な方法を、ステップ・バイ・ステップで解説します。
実装手順の全体像
- アイテム用クラスの作成: コレクションに格納する、個々のアイテムとなるクラス(例:
ClsTask
)を作成します。 - コレクションクラスの作成:
ClsTask
オブジェクトを複数管理するための、専用のコレクションクラス(例:TaskCollection
)を作成します。 - 標準モジュールでの利用: 作成したコレクションクラスを使い、アイテムの追加や参照を行います。
ステップ1: アイテム用のクラス (ClsTask
) を作成する
まず、コレクションに格納する個々の「タスク」を表す、シンプルなクラスを作成します。
- VBEで「挿入」→「クラスモジュール」を選択し、
(Name)
をClsTask
に変更します。 - 以下のコードを貼り付けます。
クラスモジュール: ClsTask
のコード
Public Description As String
Public IsCompleted As Boolean
' 情報を文字列で返すメソッド
Public Function ToString() As String
Dim status As String
If IsCompleted Then status = "完了" Else status = "未完了"
ToString = "[ " & status & " ] " & Description
End Function
ステップ2: コレクションクラス (TaskCollection
) を作成する
次に、ClsTask
オブジェクトを専門に扱う、コレクションクラスを作成します。
- VBEで「挿入」→「クラスモジュール」を選択し、
(Name)
をTaskCollection
に変更します。 - 以下のコードを貼り付けます。
クラスモジュール: TaskCollection
のコード
' --- 内部でTaskオブジェクトを保持するためのプライベートなCollection ---
Private p_Tasks As Collection
' --- 初期化イベント ---
' このクラスのオブジェクトが生成された瞬間に、内部のCollectionも生成する
Private Sub Class_Initialize()
Set p_Tasks = New Collection
End Sub
' --- メソッド (Add) ---
' 新しいタスクを追加するためのカスタムメソッド
Public Function Add(description As String, isCompleted As Boolean) As ClsTask
' 1. 新しいClsTaskオブジェクトを生成
Dim newTask As New ClsTask
newTask.Description = description
newTask.IsCompleted = isCompleted
' 2. 内部のCollectionにオブジェクトを追加
p_Tasks.Add newTask
' 3. 追加したオブジェクトを返す(任意)
Set Add = newTask
End Function
' --- プロパティ (Item) ---
' インデックスを指定して、特定のタスクを取得する
Public Property Get Item(index As Long) As ClsTask
Set Item = p_Tasks(index)
End Property
' --- プロパティ (Count) ---
' 格納されているタスクの数を返す(読み取り専用)
Public Property Get Count() As Long
Count = p_Tasks.Count
End Property
ステップ3: 標準モジュールでコレクションクラスを利用する
最後に、作成した TaskCollection
を使って、タスクを管理するコードを標準モジュールに記述します。
標準モジュール: Module1
のコード
Sub ManageTasks()
' 1. コレクションクラスから新しいオブジェクトを生成
Dim myTasks As New TaskCollection
' 2. カスタムのAddメソッドで、新しいタスクを追加
myTasks.Add "要件定義書を作成する", True
myTasks.Add "基本設計書を作成する", True
myTasks.Add "詳細設計書を作成する", False
' 3. Countプロパティでタスクの数を確認
Debug.Print "タスクの総数: " & myTasks.Count
Debug.Print "---"
' 4. Itemプロパティを使って、ループで各タスクの情報を表示
Dim i As Long
For i = 1 To myTasks.Count
Debug.Print myTasks.Item(i).ToString()
Next i
End Sub
実行結果
ManageTasks
を実行すると、イミディエイトウィンドウに以下のように出力されます。
タスクの総数: 3
---
[ 完了 ] 要件定義書を作成する
[ 完了 ] 基本設計書を作成する
[ 未完了 ] 詳細設計書を作成する
コードの解説
コレクションクラスの仕組み
Private p_Tasks As Collection
: クラスの内部に、標準のCollection
オブジェクトを隠し持っています。これが、実際のデータを格納する本体です。Public Function Add(...)
:p_Tasks.Add
を直接使わせるのではなく、ClsTask
オブジェクトを正しく作成してから追加する、という手順をカプセル化した、このクラス専用のAdd
メソッドです。これにより、このコレクションにはClsTask
オブジェクトしか追加できないようになり、型安全性が保証されます。Public Property Get Item(...)
/Count()
: 内部のp_Tasks
コレクションのItem
とCount
の機能を、そのまま外部に公開するための「窓口」です。
まとめ
今回は、VBAでカスタムコレクションクラスを作成する、本格的なオブジェクト指向のテクニックを解説しました。
- アイテム用のクラスと、それを管理するコレクションクラスの2種類を作成する。
- コレクションクラスは、内部に標準の
Collection
を持ち、それを操作するための専用のAdd
メソッドやItem
,Count
プロパティを外部に公開する。
この手法を用いることで、特定の種類のオブジェクトだけを安全に管理でき、かつ独自のメソッド(例: FindByDescription()
など)を追加することも可能な、非常に拡張性の高いプログラム部品を構築できます。