我试图弄清楚如何将连续的非连续单元格范围添加到多列列表框中,但只有下面的第二行有效。
lbxSelectable.List = Sheets("DB").Range("A1,B1,C1").Value
lbxSelectable.List = Sheets("DB").Range("A1:C1").Value
是否有任何有效的功能可以让我连续选择某些列并将其粘贴在多列列表框的条目中?
非常感谢
要在多列列表框中连续显示不连续的单元格范围,您必须首先创建一个数组,然后将其分配给.list
列表框。这是一个例子。
Option Explicit
Private Sub CommandButton1_Click()
Dim Ar() As String
Dim rng As Range, cl As Range
Dim i As Long
Set rng = Range("A1,C1,E1")
i = 1
For Each cl In rng
ReDim Preserve Ar(1, 1 To i)
Ar(1, i) = cl.Value
i = i + 1
Next
With ListBox1
.ColumnCount = i - 1
.ColumnWidths = "50;50;50"
.List = Ar
End With
End Sub
快照
一、显示不连续的列数据,不循环
除了Siddharth 的有效解决方案之外,我还展示了一种无需任何循环的灵活方法。此外,我添加了不仅可以显示一个数据行,还可以显示更多数据行以及定义变化的起始行的可能性(例如m=2
,在本例中:-)。
逐步应用的方法
在完全限定 section 中的范围引用[0]
,定义 section 中的起始行和结束行后[1]
,section通过使用►方法的高级过滤可能性[2]
将所需列分配给变量数据字段数组来完成主要工作•):Application.Index
Application.Index
方法过滤第 1、3、5 列(= A、C、E)。部分[3]
用数组中的数据填充列表框,这些数据必须是二维的。如果数据集有多个项目“行”,它们将被分配给列表框的 ►<code>.List 属性 - 参见。[3]b) 节。
但是,如果只有一个数据行,则数组v
将丢失一个所需的维度,因此必须通过该方法转置Application.Transpose
(更改行和列,但重新获得第二个维度!),然后分配给列表框 ►<code >.Column 属性。
•) 参见。在没有循环或 API 调用的数据字段数组中插入第一列
Option Explicit ' declaration head of code module
Private Sub CommandButton1_Click()
' [0] Declare variables start row, lastrow, (variant) datafield array, worksheet
Dim m&, n&, v, ws As Worksheet ' data types Long, Long, Variant, WorkSheet
Set ws = ThisWorkbook.Worksheets("mySheet") ' << change to your sheet name
' [1] define Start Row m and Last Row n (based on items in column A)
m = 2: n = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
' [2] assign data to variant datafield array
v = Application.Index(ws.Range("A1:E" & n).Value2, Evaluate("row(" & m & ":" & n & ")"), Array(1, 3, 5))
' [3] fill ListBox with array contents
With ListBox1
.ColumnWidths = "50;50;50"
If m = n Then ' Case a) SINGLE data row only (needs transposed data)
.ColumnCount = UBound(v, 1) ' counts 1st dimension of v
.Column = Application.Transpose(v) ' << assign transposed array v to listbox COLUMN property
Else ' Case b) several data rows
.ColumnCount = UBound(v, 2) ' counts 2nd dimentson of v
.List = v ' << assign array v to listbox LIST property
End If
End With
End Sub
二、简单的替代方案ColumnWidths
当然,可以收集整个数据范围的列,但是通过属性为要在显示中省略的列A:E
定义零宽度:ColumnWidths
With ListBox1
.ColumnWidths = "50;0;50;0;50"
' ...
End With
好好享受 :-)