Excel VBA多列列表框添加不连续的范围

时间:2012-05-16 15:28:08

标签: excel vba listbox

我试图找出如何将一行中不连续的单元格添加到多列列表框中,但只有下面的第二行才有效。

lbxSelectable.List = Sheets("DB").Range("A1,B1,C1").Value
lbxSelectable.List = Sheets("DB").Range("A1:C1").Value

是否有任何高效的功能可以让我连续选择某些列并将其粘贴在多列列表框的条目中?

非常感谢

2 个答案:

答案 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

<强>快照

enter image description here

答案 1 :(得分:0)

I。显示不连续的列数据而没有循环

除了 Siddharth的有效解决方案之外,我还演示了一种灵活的方法没有任何循环的必要性。 此外,我还添加了一种可能性,即不仅可以显示一个,而且可以显示甚至更多的数据行,并可以定义一个变化的起始行(例如,本示例中的m=2 :-)。

逐步应用方法

在对[0]节中的范围引用进行完全限定之后,在[1]节中定义开始行和结束行, [2]节通过将所需的列分配给变量数据字段数组来完成主要工作 使用►Application.Index方法的高级过滤可能性•):

  • a)首先,它获得了从第一行第一行到右列E的整个数据范围内容,
  • b)最终从第二行m(即省略标题行)开始,最后拉出n和
  • c)最后通过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

享受它:-)