VBA Excel 用多列填充列表框
VBA Excel Populate ListBox with multiple columns
对于某些人来说,这可能是一个廉价的问题,但我对如何填充列表框感到非常困惑。
使用这一行我可以填充列表框,如下所示:
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
下面是我计划用来填充列表框的数据,并且是渐进的。只有该列具有修复计数。
有人请教我如何使用 FOR LOOP 填充适应多列和多行的列表框,如我上面的代码所示。任何帮助表示赞赏。谢谢。
这个怎么样:
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
方法
- 遍历数组总是比遍历范围更好 - 它快得多。
- 使用 一个衬里 创建一个变体数据字段数组甚至更快,而不是按照 Siddharth Rout 的建议重新定义一个预先声明的数组并将其填充到一个额外的循环中(尽管好方法 :-) 注意: 下面的代码是基于他在上面评论中引用的方法,只是为了演示差异。
- 用数组填充
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
' 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
其他提示
数组方法的另一个优点——它克服了使用时只有10列的内置限制.AddItem
方法。
此外,请记住列表框索引是从零开始的,因此例如您得到的电子邮件地址(第 3 列,索引 2)您的第一个项目行(索引 0)通过 ListBox1.List(0, 2)
,而数据字段数组自动变为基于一个的 2-dim 数组。
您不限于使用 .List
方法从列表框中获取信息,您可以使用 ListBox1.Column" or even create a new array out of it, which remains a 2-dim object, even if there is only ONE item (note: the
[=67 反转行 - 列顺序=]` 方法会将只有一行的二维数组重新调整为一维数组)。
最后一点:您可以通过 rng = ListBox1.List
轻松地将整个列表框转回 Excel sheet,但要注意定义正确的范围.
对于某些人来说,这可能是一个廉价的问题,但我对如何填充列表框感到非常困惑。
使用这一行我可以填充列表框,如下所示:
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
下面是我计划用来填充列表框的数据,并且是渐进的。只有该列具有修复计数。
有人请教我如何使用 FOR LOOP 填充适应多列和多行的列表框,如我上面的代码所示。任何帮助表示赞赏。谢谢。
这个怎么样:
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
方法
- 遍历数组总是比遍历范围更好 - 它快得多。
- 使用 一个衬里 创建一个变体数据字段数组甚至更快,而不是按照 Siddharth Rout 的建议重新定义一个预先声明的数组并将其填充到一个额外的循环中(尽管好方法 :-) 注意: 下面的代码是基于他在上面评论中引用的方法,只是为了演示差异。
- 用数组填充
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
' 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
其他提示
数组方法的另一个优点——它克服了使用时只有10列的内置限制
.AddItem
方法。此外,请记住列表框索引是从零开始的,因此例如您得到的电子邮件地址(第 3 列,索引 2)您的第一个项目行(索引 0)通过
ListBox1.List(0, 2)
,而数据字段数组自动变为基于一个的 2-dim 数组。您不限于使用
.List
方法从列表框中获取信息,您可以使用ListBox1.Column" or even create a new array out of it, which remains a 2-dim object, even if there is only ONE item (note: the
[=67 反转行 - 列顺序=]` 方法会将只有一行的二维数组重新调整为一维数组)。最后一点:您可以通过
rng = ListBox1.List
轻松地将整个列表框转回 Excel sheet,但要注意定义正确的范围.