Excel VBA - 循环访问ListBox控件

时间:2013-04-10 14:44:26

标签: excel vba excel-vba

我正在尝试遍历各个工作表,然后是每个工作表中的列表框控件,并用我的代码填充它们。我使用下面的代码:

Dim sh As Worksheet
Dim obj As OLEObject
Dim lst As MSForms.ListBox
Dim idx As Long

For idx = 1 To ThisWorkbook.Worksheets.Count
    Set sh = ThisWorkbook.Worksheets(idx)
    For Each obj In sh.OLEObjects
        If obj.progID = "Forms.ListBox.1" Then
            Set lst = obj
            If (lst.Name = "lst1") Then
                Call PopulateSimple(lst, "Table1")
            End If
        End If
    Next
Next idx

当我将列表框设置为对象时,这似乎失败了。有没有想过如何在不同的工作表中循环遍历所有列表框然后填充它们?

3 个答案:

答案 0 :(得分:2)

试试这个

Sub Sample()
    Dim sh As Worksheet
    Dim obj As OLEObject
    Dim idx As Long

    For idx = 1 To ThisWorkbook.Worksheets.Count
        Set sh = ThisWorkbook.Worksheets(idx)
        For Each obj In sh.OLEObjects
            If TypeOf obj.Object Is MSForms.ListBox Then
                If (obj.Name = "lst1") Then
                    Call PopulateSimple(obj, "Table1")
                End If
            End If
        Next
    Next idx
End Sub

解释:您收到该错误,因为obj被声明为OLEObject而lst被称为MSForms.ListBox,因此类型不匹配。

答案 1 :(得分:0)

你不能在调用 PopulateSimplesince 时使用obj你知道它是一个ListBox:

Dim sh As Worksheet
Dim obj As OLEObject
Dim lst As MSForms.ListBox
Dim idx As Long

For idx = 1 To ThisWorkbook.Worksheets.Count
    Set sh = ThisWorkbook.Worksheets(idx)
    For Each obj In sh.OLEObjects
        If obj.progID = "Forms.ListBox.1" Then
            'Set lst = obj
            If (obj.Name = "lst1") Then
                Call PopulateSimple(obj, "Table1")
            End If
        End If
    Next
Next idx

答案 2 :(得分:0)

最简单的方式(从评论中移除):

在我看来,你需要改变

Dim lst as MSForms.ListBox

进入

Dim lst as OLEObject 

这就是全部...