I could not find a Microsoft font talking about it, but when you set the RowSource
property of a ListBox
, you can not remove or add items to the list.
So what you can do is always popular the list according to what was typed.
Here's an example using the same RowSource
you provided in the example:
Private Sub FilterBox_Change()
' Carrega a lista com base no texto digitado
ListBox1.List = CarregarLista(ActiveSheet.Range("Customers"), FilterBox.Value)
End Sub
Private Sub UserForm_Initialize()
' Carrega a lista completa
ListBox1.List = CarregarLista(ActiveSheet.Range("Customers"))
End Sub
' Função que retorna um Array com os nomes de um determinado Range nomeado
Private Function CarregarLista(rngNomes As Range, Optional strPesquisa As String) As String()
Dim rangeCount As Long, cont As Long, nomes() As String
cont = 0
' Atua no range informado no parâmetro
With rngNomes
' Define o tamanho do array com base no tamanho do range
ReDim Preserve nomes(.Rows.Count - 1, .Columns.Count - 1)
' Laço que percorre todas as linhas do Range nomeado
For rangeCount = 1 To .Rows.Count
' Caso algum texto seja informado no parâmetro, carrega a lista filtrada
If strPesquisa <> "" Then
' Se o texto informado for parecido com algum nome do range
If UCase(.Cells(rangeCount, 1) & " " & .Cells(rangeCount, 2)) Like "*" & UCase(strPesquisa) & "*" Then
' Adiciona o nome no array
nomes(cont, 0) = .Cells(rangeCount, 1).Value
nomes(cont, 1) = .Cells(rangeCount, 2).Value
cont = cont + 1
End If
Else
' Adiciona o nome no array
nomes(cont, 0) = .Cells(rangeCount, 1).Value
nomes(cont, 1) = .Cells(rangeCount, 2).Value
cont = cont + 1
End If
Next
End With
' Retorno da lista
CarregarLista = nomes
End Function