Excel 如何使用VBA在工作表中创建MSForms列表框?

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

我正在尝试使用VBA以编程方式创建类型为
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