如何创建ActiveX组合框的数组

时间:2019-05-19 10:24:37

标签: excel vba

我试图将几个activex组合框动态添加到excel工作表中,其数量和内容取决于先前设置的其他数据。我想将它们存储到数组中以随后管理它们的内容(在同一工作表中,会有其他用途不同的组合框)。我运行以下代码:

Sub run_Combo_Test()

    Dim DestinationBookmarkCombo() As Object
    Dim i, k As Integer
    Dim nCombos, nHeaderLines, nOptions As Integer

    nCombos = 5
    nOptions = 4
    nHeaderLines = 3

    ReDim DestinationBookmarkCombo(0 To nCombos - 1) As Object
    For i = 0 To nCombos - 1
        Set DestinationBookmarkCombo(i) = Worksheets("bula").OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
                Link:=False, DisplayAsIcon:=False, Left:=50, Top:=80, Width:=100, _
                Height:=15)
        With DestinationBookmarkCombo(i)
        With .Object
            .Left = xlApp.Worksheets("bula").Cells(nHeaderLines + 1 + i, 4).Left
            .Top = xlApp.Worksheets("bula").Cells(nHeaderLines + 1 + i, 4).Top
            .Placement = 1
            For k = 1 To nOptions
                .AddItem "Option " + CStr(k)
            Next k
            .Name = "Combo_" + CStr(i)
            '.OnAction = "myCombo_Change"
        End With
        End With
    Next i

End Sub

该代码生成一个空的组合框,并返回“需要对象”错误。我无法跟踪问题出在哪里。有人可以帮忙吗? 预先感谢!

1 个答案:

答案 0 :(得分:0)

我认为您只需要在AddItem前面添加“ .Object”即可。调试这种事情很困难,因为VBA不想在动态添加用户界面对象时允许断点或步进。

Option Explicit

Sub run_Combo_Test()

Dim DestinationBookmarkCombo() As Object
Dim i, k As Integer
Dim nCombos, nHeaderLines, nOptions As Integer

nCombos = 3
nOptions = 4
nHeaderLines = 3

ReDim DestinationBookmarkCombo(0 To nCombos - 1)

For i = 0 To nCombos - 1
    Set DestinationBookmarkCombo(i) = Worksheets("bula").OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
            Link:=False, DisplayAsIcon:=False, Left:=50, Top:=80, Width:=100, _
            Height:=15)
    DestinationBookmarkCombo(i).Left = Worksheets("bula").Cells(nHeaderLines + 1 + i, 4).Left
    DestinationBookmarkCombo(i).Top = Worksheets("bula").Cells(nHeaderLines + 1 + i, 4).Top
    DestinationBookmarkCombo(i).Placement = 1
    For k = 1 To nOptions
        DestinationBookmarkCombo(i).Object.AddItem "Option " & CStr(k)
    Next k
    DestinationBookmarkCombo(i).Name = "Combo_" + CStr(i)
Next i


End Sub