銀河鉄道

【VBA】クラスで通常のCollection機能を利用する準備|ForEachが使えない

サムネイル
クラスでForEachを使いたい

自作クラスを 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 ~」は、目には見えない

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧