使用excel vba将事件分配给多个对象时出错

我遵循我在这里发现的所有build议,自动更改combobox的“更改”function。 所有工作正常,代码不会产生任何错误,直到我想更改Excel表单上的combobox值:macros不会启动。

我的代码是:

在类文件(类:COptions)

Option Explicit Public WithEvents lOptions As MSForms.ComboBox Private Sub lOptions_Change() MsgBox "hello " End Sub 

在模块文件中

 Sub macrotest() Dim j As String Dim tObject Set tObject = Sheets("test").OLEObjects.Add(ClassType:="Forms.ComboBox.1", _ Link:=False, _ DisplayAsIcon:=False, _ Left:=50, Top:=80, _ Width:=100, _ Height:=15) tObject.Name = "Combobox32" tObject.Object.Font.Size = 8 tObject.Object.BackColor = vbWhite tObject.Object.AddItem "blub1" tObject.Object.AddItem "blub2" 'MsgBox "tObject " & tObject.Name Dim Obj As OLEObject Dim Cl As COptions Set Cl = Nothing Set Collect = New Collection '(previously declared as global variable) For Each Obj In Sheets("test").OLEObjects If TypeOf Obj.Object Is MSForms.ComboBox Then MsgBox Obj.Name 'check if we enter in the loop : always successfull Set Cl = New COptions Set Cl.lOptions = Obj.Object Collect.Add Cl End If Next Obj MsgBox "Collect " & Collect.Count ' which result is 1 End Sub 

所以一切工作正常,但回到Excel工作表,当我改变combobox的值,没有任何反应。

顺便说一句,我不太了解这个代码的工作方式。

定义的类的新对象(这里:Cl)被创build和修改。 但是combobox是变化的目标,它在哪里被修改? 为什么通过改变新的对象Cl,它是它应该改变的目标对象ComboBox?

我不知道发生了什么,因为我没有在网上发现这个错误。

我该怎么办才能解决这个问题?

创buildOLEObjects并将它们连接到事件是有问题的。 不幸的是,你必须让创build对象的过程终止,然后运行一个挂钩事件的过程。 您可以使用Application.OnTime在“创build”过程之后立即运行“挂接”过程。 喜欢这个。

 Public Collect As Collection Sub macrotest() Dim j As String Dim tObject Set tObject = Sheets("test").OLEObjects.Add(ClassType:="Forms.ComboBox.1", _ Link:=False, _ DisplayAsIcon:=False, _ Left:=50, Top:=80, _ Width:=100, _ Height:=15) tObject.Name = "Combobox32" tObject.Object.Font.Size = 8 tObject.Object.BackColor = vbWhite tObject.Object.AddItem "blub1" tObject.Object.AddItem "blub2" 'MsgBox "tObject " & tObject.Name Application.OnTime Now, "LinkupCombos" End Sub Sub LinkupCombos() Dim Obj As OLEObject Dim Cl As COptions Set Cl = Nothing Set Collect = New Collection '(previously declared as global variable) For Each Obj In Sheets("test").OLEObjects If TypeOf Obj.Object Is MSForms.ComboBox Then MsgBox Obj.Name 'check if we enter in the loop : always successfull Set Cl = New COptions Set Cl.lOptions = Obj.Object Collect.Add Cl End If Next Obj MsgBox "Collect " & Collect.Count ' which result is 1 End Sub