I want to search for a word in a ListBox that has data drawn from a worksheet.
A video on YouTube Advance Multi column Search in Listbox with Single Textboxt, describes code to search in a ListBox for a keyword typed into a Textbox on the same Userform.
It works for a data set of 6 columns. When I change the code and corresponding control properties for a data set of 11 columns, the code throws
Run-Time Errors 380 and 381
in the two For... Next loops.
I am using Excel 2013 on Windows 10.
Private Sub TextBox2_AfterUpdate()
With Me.ListBox2
.Clear
For ColHead = 1 To 11
.AddItem
.List(0, ColHead - 1) = Sheet2.Cells(1, ColHead).Value '<<< 'Run-Time Error 380, Invalid Property Value
Next ColHead
' If I comment out the For... Next loop above the code runs up to the next For... Next loop below _
and there it throws up run-time error 381. I have marked it there with a comment.
ListRow = 1
If IsDate(Me.TextBox2) Then
FindVal = CDate(Me.TextBox2)
ElseIf IsNumeric(Me.TextBox2) Then FindVal = Val(Me.TextBox2)
Else
FindVal = "*" & Me.TextBox2 & "*"
End If
LastRow = Sheet2.Range("A" & Rows.Count).End(xlUp).Row
For ShRow = 2 To LastRow
FindRow = Application.WorksheetFunction.CountIf(Sheet2.Rows(ShRow).EntireRow, FindVal)
If FindRow > 0 Then
For ListCol = 1 To 11
.AddItem
.List(ListRow, ListCol - 1) = Sheet2.Cells(ShRow, ListCol).Value '<<< 'Run-Time Error 381, Invalid Property Value
Next ListCol
ListRow = ListRow + 1
End If
Next ShRow
End With
End Sub
There is a limit of 10 columns if you use unbound data sources for a listbox:
From the official documentation:
Setting ColumnCount to 0 displays zero columns, and setting it to -1 displays all the available columns. For an unbound data source, there is a 10-column limit (0 to 9).
Update: There are two ways to fill a listbox:
The first is to assign a Range to the listbox (the property is called RowSouce
). With that, you can have more than 10 columns, and you can have a header row. This is called "bound" data source (because the listbox data is bound to a range).
The second is to fill the list manually (as you do), by calling AddItem
for every row you want to display. As the data is not bound to anything, this is called "unbound", and for whatever reason there are a max of 10 columns supported (0..9) and you can't have a header row.
The property BoundColumn
defines which column is seen as "value". If you define 1 as boundColumn and check the value
-property of the listbox (eg in a change event), the value of the first column of the selected row is used. This is true for bound and unbound lists.