我试图找出如何将一行中不连续的单元格添加到多列列表框中,但只有下面的第二行才有效。
lbxSelectable.List = Sheets("DB").Range("A1,B1,C1").Value
lbxSelectable.List = Sheets("DB").Range("A1:C1").Value
是否有任何高效的功能可以让我连续选择某些列并将其粘贴在多列列表框的条目中?
非常感谢
答案 0 :(得分:3)
要将行中不连续的单元格范围显示到多列列表框,您必须先创建一个数组,然后将其分配给列表框的.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
<强>快照强>
答案 1 :(得分:0)
I。显示不连续的列数据而没有循环
除了 Siddharth的有效解决方案之外,我还演示了一种灵活的方法没有任何循环的必要性。
此外,我还添加了一种可能性,即不仅可以显示一个,而且可以显示甚至更多的数据行,并可以定义一个变化的起始行(例如,本示例中的m=2
:-)。
逐步应用方法
在对[0]
节中的范围引用进行完全限定之后,在[1]
节中定义开始行和结束行,
[2]
节通过将所需的列分配给变量数据字段数组来完成主要工作
使用►Application.Index
方法的高级过滤可能性•):
Application.Index
方法过滤第1,3,5列(= A,C,E)。第[3]
节用数组中必须为二维的数据填充列表框。
如果数据集具有多个“行”,它们将分配给列表框的►.List
属性-参见。 [3] b)。
但是,如果只有一个单个数据行,则数组v
将失去一个所需的维,因此必须通过{进行转置 {1}}方法(更改行和列,但重新获得第二维!),然后将其分配给列表框的►Application.Transpose
属性。
•)cf. Insert first column in datafield array without loops or API calls
.Column
II。改编后的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
,但可以定义{strong>零宽度,以便通过A:E
在显示时省略这些列属性:
ColumnWidths
享受它:-)