@servercold
Analisando seu modelo, pude constatar que no evento Initialize do Userform você alimenta o ListBox usando a propriedade RowSource (que por definição usa um Range/Intervalo ou um objeto do tipo ListObject, que é o seu caso).
Neste caso, para que sua pesquisa retornasse os valores encontrados juntamente com os cabeçalhos, acredito que o filtro deveria ser aplicado ao objeto, no caso, sua tabela e só então retornar novamente os dados da tabela já filtrada.
Outra maneira mais comumente utilizada para alimentar o ListBox com mais de 10 colunas (por isso que o erro ocorre, pois este controle possui uma limitação), seria armazenar os dados em lista Array/Matriz (em memória) e retornar esta lista, após a pesquisa, ao controle ListBox porém, os cabeçalhos não seriam retornados de forma fixa ao controle.
Segue abaixo um exemplo de como adotar o método usando listas Array/matrizes:
Sub pesquisaProcesso(ByVal termoPesquisa As String)
Dim contRegistros As Long
Dim dadosProcesso() As String
Dim planDados As Worksheet
Dim linhaIni As Long, linhaFim As Long
Dim colIni As Long, colFim As Long
contRegistros = 0
Erase dadosProcesso
Set planDados = ThisWorkbook.Sheets("TabDados")
With frmProcessos.ListBox1
.RowSource = ""
.Clear
End With
With planDados
linhaIni = 6
linhaFim = .Cells(Rows.Count, 1).End(xlUp).Row
colIni = 1
colFim = .Cells(5, Columns.Count).End(xlToLeft).Column
ReDim dadosProcesso(1 To linhaFim, 1 To colFim)
While Not linhaIni = linhaFim
If LCase(.Cells(linhaIni, 2)) Like "*" & LCase(termoPesquisa) & "*" Then
contRegistros = contRegistros + 1
While Not colIni = colFim
dadosProcesso(contRegistros, colIni) = .Cells(linhaIni, colIni)
colIni = colIni + 1
Wend
End If
linhaIni = linhaIni + 1
colIni = 1
Wend
End With
If contRegistros >= 1 Then
With frmProcessos
With .ListBox1
.RowSource = ""
.Clear
.ColumnCount = colFim
.List = dadosProcesso
Do
If .List(.ListCount - 1, 0) = "" Then .RemoveItem .ListCount - 1
Loop While .List(.ListCount - 1, 0) = ""
End With
End With
End If
With frmProcessos.Lbl_TotRegistros
.Caption = "Total de " & frmProcessos.ListBox1.ListCount & " processo(s) encontrado(s)"
End With
End Sub
Adicione a rotina acima em um novo módulo e substitua as linhas entre bloqueado=True e bloqueado=False no evento Change do controle caixa_Filtro por Call pesquisaProcesso(Me.caixa_Filtro) e verá que o filtro funcionará.
Espero ter ajudado.
Abs.
Saulo Robles
Postado : 19/03/2021 12:52 am