Вопрос по vba, listbox, excel – Excel VBA Multicolumn Listbox добавить несмежный диапазон

2

Я пытаюсь выяснить, как добавить несмежный диапазон ячеек в строке в многоколонном списке, но работает только вторая строка ниже.

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

Есть ли эффективная функция, которая позволит мнеselect certain columns в ряд и воткнуть его в записьmulticolumn список?

Большое спасибо

Ответил на старый вопрос, но продемонстрировал хитрый способ заполнения списка с несмежными данными столбцов без всякой петли используя довольно неизвестные функции ►Application.Index метод :-) @ Гелион T.M.

Ваш Ответ

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

СНАПШОТ

Большое спасибо, это работает! Gelion
Хотя это старая запись, может быть, вас интересует хитрый способ заполнения списка с несмежными данными столбцов без всякой петли :-) @ SiddharthRout T.M.
0

Я. Отображать несмежные данные столбца без циклов

В дополнении к Сиддхарт @ правильное решение я демонстрирую гибкий подход без всякой петли необходимость. Кроме того, я добавил возможность отображать не только один, но и еще больше строк данных а также для определения переменной стартовой строки (например,m=2 в этом примере: -).

Применяемый метод шаг за шагом

После полной квалификации ссылки на диапазон в разделе[0], определяя начальную строку и конечную строку в разделе[1], раздел[2] выполняет основную работу, назначая нужные столбцы в массив различных полей данных, используя расширенные возможности фильтрации из ►Application.Index метод •):

a) Сначала он получает содержимое всего диапазона данных из верхней строки 1 в правый столбец E,b) в конце концов начинается со 2-й строки m (то есть без заголовка) до n иc) окончательно фильтрует столбцы 1,3,5 (= A, C, E) черезApplication.Index метод.

Раздел[3] заполняет список данными из массива, которые должны быть 2-мерная. Если наборы данных имеют более одного «ряда» элементов, они присваиваются ►.List свойство списка - ср. раздел [3] б).

Если есть толькооди одна строка данных, массивv потеряет одно необходимое измерение, поэтому оно должно быть Транспонированной черезApplication.Transpose метод (изменение строк и столбцов, но восстановление 2-го измерения!), а затем присвоение спискам ►.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

II. Простая альтернатива с адаптированнымColumnWidths

Конечно, можно было бы собрать столбцы всего диапазона данныхA:E, но для определения нулевая ширина для столбцов, которые будут пропущены при отображении черезColumnWidths свойство

With ListBox1
  .ColumnWidths = "50;0;50;0;50"
  ' ...
End With

Наслаждайся этим :-

Похожие вопросы