Только что вернулся к вам ... немного долго, но вот общие мысли ...
Все это входит в код для элемента управления ActiveX:
Option Explicit
Sub ListBox1_Click()
Dim rw As Range, strtext As String
Dim arr As Variant, ai As Long, aj As Long
Dim brr As Variant, bi As Long, bj As Long
strtext = "a" 'I used this when i did my testing
ReDim arr(11, 0)
For Each rw In Range("rng")
If InStr(LCase(rw.Value), strtext) Then
aj = findaj(arr)
If Not IsEmpty(arr(1, aj)) Then
aj = aj + 1
ReDim Preserve arr(11, aj)
End If
For ai = 1 To 11
arr(ai, aj) = Cells(rw.Row, ai + 1).Value
Next ai
End If
Next rw
ReDim brr(aj, 11)
For bi = 0 To aj
For bj = 1 To 11
brr(bi, bj) = arr(bj, bi)
Next bj
Next bi
ListBox1.ColumnCount = 11
ListBox1.List = brr
End Sub
Private Function findaj(ByVal brr As Variant)
Dim j As Long, meow As String
j = 0
Do While True
On Error GoTo toll
j = j + 1
meow = brr(1, j)
Loop
toll:
findaj = j - 1
End Function
Итакздесь много чего происходит ... Я использую два отдельных массива из-за того, как редиммирующие массивы работают в VBA.Вы можете только обновить второй элемент массива, поэтому arr(ai,aj)
может обновляться только aj
только когда я redim preserve
добавляю новую строку в мой массив.
Итак, мысоздайте массив (arr
), который захватывает данные на основе ограничений VBA.Внутри этого массива мы используем функцию findaj
, которая намеренно перехватывает ошибку, чтобы определить соответствующий последний столбец в arr
(я выделил курсивом использование столбца, поскольку это не совсем так, ноэто имеет смысл пространственно, если подумать).
Затем вы конвертируете массив arr
в brr
в соответствующем порядке столбцов / строк.
После этого вы делаете .list = brr
.