【VBA】クラスで通常のCollection機能を利用する準備|ForEachが使えない
記事更新日:2022-10-20

自作クラスを For Eachでループするためには、Attributeを追加する必要があります
【参考サイト】
VBAリファレンス:For Each…Next ステートメントを使用する
Excelの神髄:VBAクラスのAttributeについて
1.クラスモジュールを作成する
Listクラス

「Listクラス」にはメンバだけ作ってみる
Option Explicit
Public aaa As String
Public bbb As String

Excelでいえば、横1行のデータ
Listsクラス

「List」がいっぱい集まった「Lists」クラスを作ってみる
Option Explicit
Private items_ As Collection '値を保持する変数
Private Sub Class_Initialize()
Set items_ = New Collection
End Sub
Private Sub Class_Terminate()
Set items_ = New Collection
End Sub
Public Sub add(ByVal aValue As String, ByVal bValue As String)
Dim List As List: Set List = New List
items_.add List
With List
.aaa = aValue
.bbb = bValue
End With
Set List = Nothing 'これをしないと、1つのListクラスに上書きされてしまう
End Sub
'Itemで呼び出せるようにする
Public Function Item(Index)
Item = items_.Item(Index)
End Function
'For Eachを使えるようにする
Public Function NewEnum() As IUnknown
Set NewEnum = items_.[_NewEnum]
End Function
2.クラスモジュールをエクスポートしてメモ帳で編集する
エクスポートしたLists.clsをメモ帳で開く

メモ帳で開いたら一番下のfunctionにコード追加
'Itemで呼び出せるようにする
Public Function Item(Index)
Attribute NewEnum.VB_UserMemId = 0
Item = items_.Item(Index)
End Function
'For Eachを使えるようにする
Public Function NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Set NewEnum = items_.[_NewEnum]
End Function

「Attribute NewEnum.VB_UserMemId = 0/-4」 が追加する部分
Lists.clsを再度インポートする
【注意事項】
- 元のクラスは解放しておかないとインポートできない
- インポートしても、見た目は元と変わらない

追加した「Attribute ~」は、目には見えない
2022-10-20
編集後記:
この記事の内容がベストではないかもしれません。