VBA - 将ActiveX ListBox的代码转换为表单ListBox

时间:2014-04-02 14:45:45

标签: excel vba listbox

我目前在工作表(Box1,Box2,Box3)中使用了三个ListBox的代码,这些代码都填充了相同的值。一个框是单选,另外两个是多选。我有渲染问题(当其他人打开文件时,框大小增加)并认为可能值得切换到表单ListBoxes。我还没有能够获得翻译代码。

目前我有这个功能来填充框:

Sub FillBox(MyBox As MSForms.ListBox, MultiType As Integer, DataArray As Variant)
    With MyBox
        .Clear
        .MultiSelect = MultiType
        For j = 1 To UBound(DataArray)
            .AddItem DataArray(j)
        Next j
    End With
End Sub

要从单选框中收集值 Box1 ,我使用:

Sheets(2).Cells(1,1) = Box1.Value

要从 Box2 Box3 获取值,可以使用以下类型的代码:

For k = 0 To Box2.ListCount - 1
    If Box2.Selected(k) = True Then
        Sheets(2).Cells(k+1,2) = Box2.List(k)
    End If
Next k

我无法使用这些相同的函数来处理表单ListBox,包括.Clear,.Selected(),。List()等。这些类型的操作的替代语法是什么?或者,如果有的话,有没有办法避免ActiveX ListBox的错误呈现?

这是渲染问题,它首先引发了这一切: enter image description here

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,这是我的解决方案:

我删除了一个列表框,添加它并在每次打开一本书时填写它。因此,在这种情况下,每次一个框将在“B3:D17”范围内

Private Sub Workbook_Open()
Set ws = Sheets("Hoja1")
    ws.OLEObjects("ListBox1").Delete

    Set Rng = ws.Range("B3:D17")

    Set mylist = ws.Range("G3:G7")

    ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", Link:=False, _
            DisplayAsIcon:=False, Left:=Rng.Left, Top:=Rng.Top, _
            Width:=Rng.Width, Height:=Rng.Height).Name = "ListBox1"

    ws.OLEObjects("ListBox1").ListFillRange = mylist.Address
End Sub

我发现了另一种方式,甚至更好:

在工作簿打开时调整列表框的大小

Private Sub Workbook_Open()

    Set ws = Sheets("Hoja1")

    Set Rng = ws.Range("B3:D17")

    With ws.Shapes.Range(Array("ListBox1"))
        .Left = Rng.Left
        .Top = Rng.Top
        .Width = Rng.Width
        .Height = Rng.Height
    End With

End Sub