Home > Enterprise >  How to reference an element in a class collection
How to reference an element in a class collection

Time:11-28

I have a collection of Toggle Buttons along with the object name of the toggle button, as is shown in the watch screen shot Watch screen shot

I have tried to reference the sName for the second item in the collection with this line itbcollection.Item(2).sName but it gives me Object does not support this property or method error. What is the appropriate code to get to the sName?

There is a class that is used to capture Mouse Down events, assigned to several ToggleButtons.

Option Explicit
Private WithEvents cTB  As MSForms.ToggleButton
Private sName As String

Public Property Let aTB(iTB As ToggleButton)
        Set cTB = iTB
        sName = cTB.Name
End Property

Private Sub cTB_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
        If Button = 1 Then Exit Sub
        Module1.RightClickDay cTB.Caption
End Sub

and at form load a loop finds all ToggleButtons and loads the collection

Dim tbEvent As cObjectArray
Dim TB(42) As Object
    x = 0
    For Each o In UFShows.Controls
        If o.Tag = "T" Then
            Set TB(x) = o
            x = x   1
            o.Visible = False
            Set tbEvent = New cObjectArray
            tbEvent.aTB = o
            iTBcollection.Add tbEvent
        End If
    Next o

CodePudding user response:

Please, use the next adapted class code and name it "TGButClass":

Option Explicit

Public WithEvents cTB  As MSForms.ToggleButton 'if not Public, it will not be exposed!
Public sName As String 'if not Public, it will not be exposed!

Public Property Set aTB(iTB As MSForms.ToggleButton)'you need Set here (nothing to  be extracted, you need to Set)
                                                    'and As TooggleButtin means a sheet control
        Set cTB = iTB
        sName = cTB.Name
End Property

Private Sub cTB_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
        If Button = 1 Then Exit Sub
        Module1.RightClickDay cTB.Caption
End Sub

A testing called sub RightClickDay should look like:

Sub RightClickDay(strName As String)
   MsgBox strName
End Sub

Then, in the form code module you should paste the next declarations and UserForm_Initializeevent:

Option Explicit

Private objMyEventClass As New Collection
Public tbEvents As TGButClass

Private Sub UserForm_Initialize()
   Dim o As Control, x As Long
   
   For Each o In Me.Controls
        If o.Tag = "T" Then
           x = x   1
           Set tbEvents = New TGButClass
           
           Set tbEvents.aTB = o
           objMyEventClass.Add tbEvents
           Debug.Print objMyEventClass(x).sName 'to see the (now) exposed sName
        End If
    Next o

End Sub

Please, send some feedback after testing it.

If something not clear enough, do not hesitate to ask for clarifications.

A similar result can be obtained using an array instead of a collection, too.

  •  Tags:  
  • vba
  • Related