VBA代码在单步执行时的行为不同

VBA代码在单步执行时的行为不同,vba,excel,class,Vba,Excel,Class,我试图编写代码来处理我的用户表单上任何组合框的“更改”事件 我根据问题的答案创建了一个单独的类,等等 但是,它不起作用。在新项目上使用相同的代码可以很好地工作,当我使用“逐步”执行(F8)时,此项目上的代码有时可以工作,但在使用正常运行时则不行 看着其他人类似的困境,我加上了“不作为”,但这没有帮助 这是我在UserForm中的代码 Private Sub UserForm_Initialize() Dim ComboBox_Collection As Collection Dim ctrl

我试图编写代码来处理我的用户表单上任何组合框的“更改”事件

我根据问题的答案创建了一个单独的类,等等

但是,它不起作用。在新项目上使用相同的代码可以很好地工作,当我使用“逐步”执行(F8)时,此项目上的代码有时可以工作,但在使用正常运行时则不行

看着其他人类似的困境,我加上了“不作为”,但这没有帮助

这是我在UserForm中的代码

Private Sub UserForm_Initialize()

Dim ComboBox_Collection As Collection
Dim ctrl As Control
Dim cbc As ComboBox_Class

Set ComboBox_Collection = New Collection
    For Each ctrl In UserForm1.MultiPage.Pages(2).Controls
    DoEvents
        If TypeName(ctrl) = "ComboBox" Then
            DoEvents
            Set cbc = New ComboBox_Class
            Set cbc.Control = ctrl
            ComboBox_Collection.Add cbc
            DoEvents
        End If
    Next ctrl
Set cbc = Nothing

End Sub
以及名为“ComboBox_class”的类模块:


ComboBox\u集合
必须是一个全局变量(至少是表单代码模块的全局变量),否则一旦
UserForm\u Initialize
Sub完成执行,它就会消失/超出范围

您能告诉我们您希望发生什么吗?@ScottMarcus,我想要一个简单的代码来处理“更改”事件,用于userform上给定类型的所有控件。谢谢!就是这样,我将收藏移到模块中,并将其公开,现在它可以工作了@mathgenius您不需要将其
公开
,除非您需要从类外访问它。即使您需要在类之外访问它,也应该将它的一个副本(可能是一个数组)作为
公共属性Get
成员公开,以保持正确的封装。
Private WithEvents TriggerComboBox As MSForms.ComboBox

Public Property Set Control(CB As MSForms.ComboBox)
    Set TriggerComboBox = CB
End Property

Private Sub TriggerComboBox_Change()
    MsgBox ("yay")
End Sub