わーぷろおじさん

WordやOffice関連の小細工の備忘録。

【vba】自作コレクションクラスの備忘録

概要

自作コレクションクラスにインスタンスをNewから直Addして、For Each又はIndexでアクセスする備忘録

前提

クラスの属性については、他のサイトで十分に解説されています。

コンストラクタに引数を持たせる方法については、自前の下記記事を参照願います。

word-ozisan.hatenablog.com

コード

Personクラス

Option Explicit
Private mName As String

Public Function Init(Name_ As String) As Person
    mName = Name_
    Set Init = Me
End Function

Public Property Get Name() As String
    Name = mName
End Property

Personsクラス

Option Explicit
Private mItems As Collection

Private Sub Class_Initialize()
    Set mItems = New Collection
End Sub

Public Property Get Item(Index_ As Long) As Person
'Attribute Item.VB_UserMemId = 0
    Set Item = mItems(Index_)
End Property

Public Property Get NewEnum() As stdole.IUnknown
'Attribute NewEnum.VB_UserMemId = -4
    Set NewEnum = mItems.[_NewEnum]
End Property

Public Sub Add(Item_ As Person)
   mItems.Add Item_
End Sub

Public Function Count() As Long
   Count = mItems.Count
End Function

コメントアウトしている部分はclsファイルに記述している内容

New_モジュール(標準モジュール)

Option Explicit
Public Property Get Person(Name_ As String) As Person
   Dim x___ As New Person
   Set Person = x___.Init(Name_)
End Property

実行(標準モジュール)

Public Sub test()
   Dim Persons As Persons
   Set Persons = New Persons
   
   Persons.Add New_.Person("Taro")
   Persons.Add New_.Person("Jiro")
   Persons.Add New_.Person("Sabu")
   
   Dim p As Person
   For Each p In Persons
        Debug.Print p.Name
    Next

  Dim i As Long
For i = 1 To Persons.Count
Debug.Print Persons(i).Name
Next
End Sub

//(出力)
//Taro
//Jiro
//Sabu
//Taro
//Jiro
//Sabu

使用感

コレクションにNewして直接Addできるのが気持ちいい。

取り出しも楽だね。