0

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

我的代码是:

在类文件中(类: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 工作表,当我更改组合框值时,什么也没有发生。

顺便说一句,我真的不明白这段代码的工作方式。

创建和修改已定义类的新对象(此处为:Cl)。但是作为更改目标的组合框,它在哪里修改?为什么通过更改新对象 Cl,它应该更改的是目标对象 ComboBox ?

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

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

4

1 回答 1

2

创建 OLEObject 并将它们与事件挂钩时存在问题。不幸的是,您必须让创建对象的过程终止,然后运行一个连接事件的过程。您可以使用 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
于 2013-10-19T14:08:20.980 回答