0

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

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

不幸的是,当我将列表框设置为对象时,这似乎失败了。关于如何实现循环遍历不同工作表中的所有列表框然后填充它们的任何想法?

4

3 回答 3

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 asMSForms.ListBox并且因此类型不匹配。

于 2013-04-10T14:57:33.630 回答
0

你不能在调用PopulateSimple时使用 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
于 2013-04-10T15:01:37.280 回答
0

最简单的方法(从评论中移出):

在我看来你需要改变

Dim lst as MSForms.ListBox

进入

Dim lst as OLEObject 

仅此而已……

于 2013-04-10T15:01:43.410 回答