Excel 如何使用VBA在工作表中创建MSForms列表框?
我正在尝试使用VBA以编程方式创建类型为Excel 如何使用VBA在工作表中创建MSForms列表框?,excel,vba,listbox,activex,ms-forms,Excel,Vba,Listbox,Activex,Ms Forms,我正在尝试使用VBA以编程方式创建类型为MSForms.ListBox的列表框 我无法使用Set ListBox=New MSForms.ListBox执行此操作,因为它引发编译错误: 在下面的代码中,当我在Macro1中创建一个时,它会创建VBAProject.Sheet1.ListBox1(或其他数字),然后我可以(在执行结束后)在Macro2中将其分配给MSForms.ListBox类型的变量,但它只能在每次运行一个宏时工作 使用MSForms.ListBox我可以更改属性,如ListBo
MSForms.ListBox
的列表框
我无法使用Set ListBox=New MSForms.ListBox执行此操作,因为它引发编译错误:
在下面的代码中,当我在Macro1
中创建一个时,它会创建VBAProject.Sheet1.ListBox1
(或其他数字),然后我可以(在执行结束后)在Macro2
中将其分配给MSForms.ListBox
类型的变量,但它只能在每次运行一个宏时工作
使用MSForms.ListBox
我可以更改属性,如ListBox.ColumnHeads=True
(即使我不知道如何更改头值,除了使用ListBox.ListFillRange=RangeAddress
将列表值寻址到一个范围之外)
如果我尝试一步一步地执行代码,我会得到消息
我从录制宏和对象中获得了OLEObject
编辑:
使用公认答案中给出的解决方案的简单工作示例:
Private Function CreateListBox( _
Optional ByVal Worksheet As Excel.Worksheet = Nothing, _
Optional ByVal Width As Long = 100, _
Optional ByVal Height As Long = 100, _
Optional ByVal Left As Long = 0, _
Optional ByVal Top As Long = 0 _
) As MSForms.ListBox
Const ClassType As String = "Forms.ListBox.1"
If Worksheet Is Nothing Then
Set Worksheet = Excel.Application.ActiveSheet
End If
Set CreateListBox = Worksheet.OLEObjects.Add( _
ClassType, _
Left:=Left, _
Top:=Top, _
Width:=Width, _
Height:=Height).Object
End Function
Private Sub Test()
Dim ListBox As MSForms.ListBox
Set ListBox = CreateListBox
Stop ' Able to stop/suspend code execution here but not inside the function when creating the OLEObject
End Sub
当您在With lb…End With
代码块内按
时,您将看到intellisense不会显示某些属性,例如.ColumnHeads
、.BorderStyle
或.List
。您可以通过在这些属性前面加上.Object
这就是你想要的吗
Sub Sample()
Dim lb As OLEObject
Dim ws As Worksheet
Set ws = Sheet1
For Each lb In ws.OLEObjects
lb.Delete
Next lb
Set lb = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", _
Top:=60, _
Left:=10, _
Height:=100, _
Width:=100)
With lb
.ListFillRange = "'" & ws.Name & "'!A1:A16" '<~~ Change range here
'.Object.List = Array("Header", "Value 1", "Value 2", "Value 3")
.Object.ColumnHeads = True
.Object.BorderStyle = MSForms.fmBorderStyle.fmBorderStyleSingle
End With
End Sub
子样本()
将lb作为对象进行调整
将ws设置为工作表
设置ws=Sheet1
对于ws.OLEObjects中的每磅
删除
下磅
Set lb=ws.OLEObjects.Add(类类型:=“Forms.ListBox.1”_
顶部:=60_
左:=10_
高度:=100_
宽度:=100)
用磅
.ListFillRange=“”&ws.Name&“!A1:A16”可能help@Zac我已经看到了,但是它创建了一个Excel.ListBox
,它的属性与我要更改的属性不同。简而言之,您想一次运行上述两个宏吗?i、 创建一个activex列表框,然后设置它的权限?你不应该创建一个名为Shape
的变量,因为这是一个已定义的对象类型。哦,这非常简单。。。一分钟就到了!我以前也试过类似的方法,但没有成功。这样我就可以将lb.Object
赋值给MSForms.ListBox
类型的变量。谢谢:)
Sub Sample()
Dim lb As OLEObject
Dim ws As Worksheet
Set ws = Sheet1
For Each lb In ws.OLEObjects
lb.Delete
Next lb
Set lb = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", _
Top:=60, _
Left:=10, _
Height:=100, _
Width:=100)
With lb
.ListFillRange = "'" & ws.Name & "'!A1:A16" '<~~ Change range here
'.Object.List = Array("Header", "Value 1", "Value 2", "Value 3")
.Object.ColumnHeads = True
.Object.BorderStyle = MSForms.fmBorderStyle.fmBorderStyleSingle
End With
End Sub