我正在尝试遍历各个工作表,然后是每个工作表中的列表框控件,并用我的代码填充它们。我使用下面的代码:
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
当我将列表框设置为对象时,这似乎失败了。有没有想过如何在不同的工作表中循环遍历所有列表框然后填充它们?
答案 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
这就是全部...