Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用excel vba将事件分配给多个对象时出错_Vba_Excel_Combobox - Fatal编程技术网

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

使用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

我遵循了我在这里找到的所有建议,自动更改组合框的“更改”功能。 一切正常,代码不会产生任何错误,直到我想更改excel工作表上的combobox值:宏未启动

我的代码是:

在类文件中(类:copions)

在模块文件中

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