使用excel vba将事件分配给多个对象时出错
我遵循了我在这里找到的所有建议,自动更改组合框的“更改”功能。 一切正常,代码不会产生任何错误,直到我想更改excel工作表上的combobox值:宏未启动 我的代码是: 在类文件中(类:copions) 在模块文件中使用excel vba将事件分配给多个对象时出错,vba,excel,combobox,Vba,Excel,Combobox,我遵循了我在这里找到的所有建议,自动更改组合框的“更改”功能。 一切正常,代码不会产生任何错误,直到我想更改excel工作表上的combobox值:宏未启动 我的代码是: 在类文件中(类:copions) 在模块文件中 Sub macrotest() Dim j As String Dim tObject Set tObject = Sheets("test").OLEObjects.Add(ClassType:="Forms.ComboBox.1", _ Li
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)的新对象。但是作为变更目标的组合框在哪里被修改?为什么通过更改新对象Cl,应该更改的是目标对象组合框
我不知道发生了什么,因为我没有在网上发现这个错误
如何解决此问题?创建对象并将其连接到事件时出现问题。不幸的是,您必须让创建对象的过程终止,然后运行连接事件的过程。您可以使用Application.OnTime在“创建”过程之后立即运行“连接”过程。像这样
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
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