2

我试图弄清楚如何将连续的非连续单元格范围添加到多列列表框中,但只有下面的第二行有效。

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

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

非常感谢

4

2 回答 2

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

快照

在此处输入图像描述

于 2012-05-16T16:41:49.823 回答
0

一、显示不连续的列数据,不循环

除了Siddharth 的有效解决方案之外,我还展示了一种无需任何循环的灵活方法。此外,我添加了不仅可以显示一个数据行,还可以显示更多数据行以及定义变化的起始行的可能性(例如m=2,在本例中:-)。

逐步应用的方法

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

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

好好享受 :-)

于 2018-10-24T20:41:39.493 回答