excel vba - Фильтр RowSource заполняет многоколоночный ListBox (для пользовательской формы) с TextBox и ComboBox
У меня возникают проблемы при попытке отфильтровать результаты ListBox в пользовательской форме на основе строки поиска в текстовом поле. Я хочу со временем связать комбинированный список, который будет выбирать столбец для поиска фильтра, но сейчас, потому что я использую свойство "RowSource", он не позволит мне удалить элементы из ListBox.
Я знаю, что есть альтернатива для заполнения ListBox с использованием массива, но я сталкиваюсь с проблемами, когда число столбцов превышает 10, и, поскольку это несвязанный список, он выдает и сообщение об ошибке.
Вот код, который у меня есть:
Private Sub UserForm_Initialize()
ListBoxCharges.RowSource = "SourceTable!A1:" & _ Sheets("SourceTable").Range("A1").SpecialCells(xlCellTypeLastCell).Address
With Me.ListBox1
.MultiSelect = fmMultiSelectMulti
.ColumnCount = Worksheets("SourceTable").UsedRange.Rows(1).Columns.Count
End With
With Me.comboboxFilter
For i = 1 To Me.ListBox1.ColumnCount
If Sheets("SourceTable").Cells(1, i).Value <> "" Then
.AddItem Sheets("SourceTable").Cells(1, i).Value 'ComboBox is populating from a horizontal headers list.
End If
Next i
End With
Private Sub txtboxFilter_Change()
Dim i As Long
Dim sCrit As String
'Add asterisks around text for all matches
'UCase is used to make filter case-insensitive
sCrit = "*" & Me.txtboxFilter.Text & "*"
With Me.ListBox1
.RowSource = "SourceTable!A1:" & Sheets("SourceTable").Range("A1").SpecialCells(xlCellTypeLastCell).Address
For i = .ListCount - 1 To 0 Step -1
If Not UCase(.List(i)) Like sCrit Then
Debug.Print .Selected(i)
.Selected(i) = False
.RemoveItem i
End If
Next i
.MultiSelect = fmMultiSelectMulti
.ColumnCount = Worksheets("SourceTable").UsedRange.Rows(1).Columns.Count
End With
End Sub
Прямо сейчас я получаю "Unspecified error" (80004005) в строке ".RemoveItem i"
Я попытался заполнить список с помощью цикла, но я получаю сообщение об ошибке "Не удалось установить свойство списка. Неверное значение свойства". Я искал, и это связано с тем, что список не связан, и он пытается добавить значение в 11-й индекс или что-то в этом роде.
With Me.ListBox1
'assuming row 1 is the row you want to use to determine the columns in the listbox
column_count = Worksheets("SourceTable").UsedRange.Rows(1).Columns.Count
'configure listbox
.ColumnCount = column_count 'number of columns
For i = 1 To Sheets("SourceTable").Cells(Rows.Count, 1).End(xlUp).Row
.AddItem
For j = 1 To column_count 'columns are index based and start at 0, but j represents sheet column and we will use -1 to indicate listbox column
.List(i - 1, j - 1) = Worksheets("SourceTable").Cells(i, j) 'This is where I get the error "could not set the list property. invalid property value"
Next j
Next i
End With
Я прошел через код, и он будет работать до j = 11, а затем я получаю ошибку в ".list(i-1, j-1) = wor....
Если бы кто-то мог направить меня в правильном направлении относительно того, что мне не хватает.
Я действительно надеюсь, что есть какой-то способ использовать RowSource для заполнения списка и фильтрации его по мере заполнения.
Спасибо!
***Обновить****
Я нашел способ отфильтровать исходные данные и затем добавить отфильтрованный список в именованный диапазон, но когда я пытаюсь добавить этот именованный диапазон в качестве RowSource, он дает мне ошибку:
Ошибка времени выполнения "380": не удалось установить свойство RowSource. Недопустимое значение свойства.
Я полагаю, что это потому, что именованный диапазон ссылается на непоследовательные строки, а RowSource ищет таблицу без пропущенных строк?
Есть ли смысл следовать этому маршруту?
Спасибо!