TYale
TYale

Reputation: 114

VBA Custom Event Not Found when Raised in UserForm

I was following this MSDN guide on creating custom events. I feel like I understand the process now, but I cannot figure out why I am getting a Compile Error: Event Not Found for RaiseEvent ItemAdded. The weird thing is, the ItemAdded event is recognized by the IDE (I can type it in all lowercase and it is then automatically formatted properly), so I know that it is recognized by VB.

DataComboBox Class Module Code:

Public Event ItemAdded(sItem As String, fCancel As Boolean)

Private pComboBox As Control

Public Property Set oComboBox(cControl As Control)
    Set pComboBox = cControl
End Property

Public Property Get oComboBox() As Control
    oComboBox = pComboBox
End Property

Private Sub Class_Initialize()

End Sub

Private Sub Class_Terminate()

End Sub

The UserForm contains two controls - a CommandButton named btnAdd and a ComboBox named cboData.

UserForm Code:

Private WithEvents mdcbCombo As DataComboBox

Private Sub UserForm_Initialize()
    Set mdcbCombo = New DataComboBox
    Set mdcbCombo.oComboBox = Me.cboData
End Sub

Private Sub mdcbCombo_ItemAdded(sItem As String, fCancel As Boolean)
    Dim iItem As Long
    If LenB(sItem) = 0 Then
        fCancel = True
        Exit Sub
    End If
    For iItem = 1 To Me.cboData.ListCount
        If Me.cboData.List(iItem) = sItem Then
            fCancel = True
            Exit Sub
        End If
    Next iItem
End Sub

Private Sub btnAdd_Click()
    Dim sItem As String
    sItem = Me.cboData.Text
    AddDataItem sItem
End Sub

Private Sub AddDataItem(sItem As String)
    Dim fCancel As Boolean
    fCancel = False
    
    RaiseEvent ItemAdded(sItem, fCancel)
    
    If Not fCancel Then Me.cboData.AddItem (sItem)
    
End Sub

Upvotes: 1

Views: 986

Answers (1)

DarrenMB
DarrenMB

Reputation: 2380

You cannot raise an event outside the classes file level.

Add a routine like this inside "DataComboBox1" to allow you to raise the event externally.

Public Sub OnItemAdded(sItem As String, fCancel As Boolean)
    RaiseEvent ItemAdded(sItem, fCancel)
End Sub

Then call the OnItemAdded with the current object.

Example...

Private WithEvents mdcbCombo As DataComboBox
...
mdcbCombo.OnItemAdded(sItem, fCancel)

Upvotes: 2

Related Questions