VBA Excel使用多列填充ListBox

6
这可能对一些人来说是一个简单的问题,但我完全不知道如何填充我的列表框。

form with listbox

使用这行代码,我可以像下面展示的那样填充列表框:
ListBox1.List = Sheets("Sheet1").Cells(1, 1).CurrentRegion.Value
或者
Dim rngName As Range
Dim ws As Worksheet
Dim i As Integer
Set ws = Worksheets("Sheet1")
    For i = 1 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row Step 1
        If ws.Cells(i, 1).Value <> vbNullString Then Me.ListBox1.AddItem 
        ws.Cells(i, 1).Value
Next i

form with listbox 1 column output

以下是我计划用来填充列表框的数据,是逐步进行的。只有列数是固定的。
Data

请有经验的人指导我如何使用“FOR LOOP”在多行多列中自适应地填充列表框,就像我上面的代码一样。感谢任何帮助。谢谢。

3
你看过这个了吗? - Siddharth Rout
1
对于非连续范围,请参见此处 - Siddharth Rout
2
为什么你想要循环?不循环会更快。 - Rory
此外,如果您有一个如下所示的查找表,难道您不只需要一个下拉菜单,其他的就会自动填充,除非您需要更新功能? - QHarr
我说的是动态命名范围。它是动态而不是静态的。这也可以进行查找。 - QHarr
显示剩余15条评论
2个回答

13

方法

  1. 循环遍历数组比范围更快,速度要快得多
  2. 使用一行代码创建变量数据字段数组要比重新声明并在额外的循环中填充它更快,如Siddharth Rout所提出的方法。(虽然这是一个不错的方法 :-))注意:以下代码基于他在上面评论中提到的方法,仅用于演示差异。
  3. 使用相同的方法将数组填充到ListBox1.List中(但方向相反)。

代码

Private Sub CommandButton1_Click()
' Purpose:  fill listbox with range values after clicking on CommandButton1
'           (code could be applied to UserForm_Initialize(), too)
' Note:     based on @Siddharth-Rout 's proposal at https://dev59.com/A2TWa4cB1Zd3GeqPBkZk
'           but creating a variant data field array directly from range in a one liner
'           (instead of filling a redimensioned array with range values in a loop)
Dim ws      As Worksheet
Dim rng     As Range
Dim MyArray                 ' variant, receives one based 2-dim data field array
'~~> Change your sheetname here
Set ws = Sheets("Sheet1")

'~~> Set you relevant range here
Set rng = ws.Range("A1:C" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row)

With Me.ListBox1
    .Clear
    .ColumnHeads = False
    .ColumnCount = rng.Columns.Count

    '~~> create a one based 2-dim datafield array
     MyArray = rng

    '~~> fill listbox with array values
    .List = MyArray

    '~~> Set the widths of the column here. Ex: For 5 Columns
    '~~> Change as Applicable
    .ColumnWidths = "50;50;50"
    .TopIndex = 0
End With
End Sub

额外提示

  • 数组方法的另一个优点是 - 它克服了使用.AddItem方法时仅限10列的内置限制。

  • 此外,请记住,listbox索引是从零开始的,因此例如您可以通过ListBox1.List(0, 2)获取第一项行(索引0)的电子邮件地址(列3,索引2),而数据字段数组自动变为基于1的二维数组。

  • 您并不局限于使用.List方法从listbox中获取信息,您可以通过使用ListBox1.Column反转行-列顺序,甚至可以创建一个新的数组出来,该数组仍然是一个2-dim对象,即使只有一个项目(注意:Application.Transpose`方法会将只有一行的二维数组重新定义为1-dim数组)。

  • 最后一点:您可以通过rng = ListBox1.List轻松地将整个listbox倒回Excel表格中,但要注意定义正确的范围。


1
我非常感激您为我提供的积极学习环境。我发现您给我的方法更好! - Serversta
很高兴能够帮助,我的编辑中还有一些额外的提示。 - T.M.

4
这个怎么样:
Sub foo()
Dim rngName As Range
Dim ws As Worksheet
Dim i As Integer
Set ws = Worksheets("Sheet1")
ListBox1.Clear
ListBox1.columnCount = 3
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    For i = 1 To LastRow
        If ws.Cells(i, 1).Value <> vbNullString Then ListBox1.AddItem ws.Cells(i, 1).Value
        If ws.Cells(i, 2).Value <> vbNullString Then ListBox1.List(i - 1, 1) = ws.Cells(i, 2).Value
        If ws.Cells(i, 3).Value <> vbNullString Then ListBox1.List(i - 1, 2) = ws.Cells(i, 3).Value
    Next i
End Sub

谢谢您花时间帮助我,我非常感激! - Serversta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接