【VBA】カスタムコレクションクラスの作り方|複数オブジェクトをスマートに管理する

目次

はじめに

VBAで自作のクラス(オブジェクト)を複数扱う際、それらを配列や標準の Collection オブジェクトで管理することが多いですが、いくつか不便な点があります。

  • 配列: ReDim Preserve でのサイズ変更が少し面倒。
  • 標準 Collection: どんな種類のオブジェクトでも追加できてしまうため、型安全性が低い。

これらの課題を解決し、より堅牢で使いやすいオブジェクトの管理を実現するのが「カスタムコレクションクラス」です。これは、「自作オブジェクトを管理するためだけの、専用のクラス」を作成する、高度なオブジェクト指向のテクニックです。

この記事では、2つのクラスモジュールを使い、独自のコレクションクラスを作成する本格的な方法を、ステップ・バイ・ステップで解説します。


実装手順の全体像

  1. アイテム用クラスの作成: コレクションに格納する、個々のアイテムとなるクラス(例: ClsTask)を作成します。
  2. コレクションクラスの作成: ClsTask オブジェクトを複数管理するための、専用のコレクションクラス(例: TaskCollection)を作成します。
  3. 標準モジュールでの利用: 作成したコレクションクラスを使い、アイテムの追加や参照を行います。

ステップ1: アイテム用のクラス (ClsTask) を作成する

まず、コレクションに格納する個々の「タスク」を表す、シンプルなクラスを作成します。

  1. VBEで「挿入」→「クラスモジュール」を選択し、(Name)ClsTask に変更します。
  2. 以下のコードを貼り付けます。

クラスモジュール: 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 オブジェクトを専門に扱う、コレクションクラスを作成します。

  1. VBEで「挿入」→「クラスモジュール」を選択し、(Name)TaskCollection に変更します。
  2. 以下のコードを貼り付けます。

クラスモジュール: 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 コレクションの ItemCount の機能を、そのまま外部に公開するための「窓口」です。

まとめ

今回は、VBAでカスタムコレクションクラスを作成する、本格的なオブジェクト指向のテクニックを解説しました。

  • アイテム用のクラスと、それを管理するコレクションクラスの2種類を作成する。
  • コレクションクラスは、内部に標準の Collection を持ち、それを操作するための専用の Add メソッドや Item, Count プロパティを外部に公開する。

この手法を用いることで、特定の種類のオブジェクトだけを安全に管理でき、かつ独自のメソッド(例: FindByDescription() など)を追加することも可能な、非常に拡張性の高いプログラム部品を構築できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次