Notifications
Clear all

[Resolvido] Filtro Pesquisa - ListBox Não Retorna Dados [RESOLVIDO]

9 Posts
3 Usuários
2 Reactions
1,434 Visualizações
(@servercold)
Posts: 8
Active Member
Topic starter
 

Olá Pessoal, Boa Noite!

Depois de algum tempo, voltei para solicitar mais uma vez as consultas produtivas de voces, vamos lá.

Tenho esse sistema de Controle de Processo de Honorários Advocatícios que está em implantação. O que ocorre é que no Filtro de Pesquisa da ListBox não consigo listar nenhum registro por nome do cliente. A listbox esta funcionando perfeitamente o erro só ocorre quando clico no campo de pesquisa.

Quando não é utilizado o campo de pesquisa, utilizo a seleção direto pelos registros já listados na ListBox, e consigo efetuar todas as operações de: Inclusão, Alteração, e exclusão.

outro problema é que no momento de clicar no campo pesquisa, o cabeçalho não é listado.

Fico no aguardo!

Obs: Anexei os arquivos apenas do formulário do projeto VBA, caso seja necessário a planilha favor solicitar.

A rotina de pesquisa está neste Módulo: Private Sub caixa_Filtro_Change()

 

 

Este tópico foi modificado 4 anos atrás 3 vezes by servercold
 
Postado : 12/03/2021 12:28 am
(@servercold)
Posts: 8
Active Member
Topic starter
 

Bom Dia a Todos!

dentro do que foi solicitado está faltando algo que eu possa esclarecer, tah faltando material para análise. quando possível nos dê um retorno por gentileza.

Fico muito grato

 
Postado : 16/03/2021 8:46 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Bom dia, @servercold

Debugar um Userform avulso, sem ter a fonte de dados pra testar vai ser um pouco difícil achar alguém que se voluntarie a fazê-lo, pois o membro terá que construir uma base de dados fictícia com os nomes de campo/controle certos, nos locais/intervalos certos... enfim. Anexe um modelo fornecendo uma amostragem resumida mas  significativa, descaracterizando antes quaisquer informações confidenciais.

Além disso, ao fazê-lo, preferivelmente elimine antes outros elementos que não estejam no foco do problema pra torná-lo menos complexo, eliminar ruídos e análises desnecessárias.

 
Postado : 16/03/2021 9:07 am
(@servercold)
Posts: 8
Active Member
Topic starter
 

@edsonbr ok,  peço desculpas vou postar a planilha completa

 
Postado : 16/03/2021 9:55 am
(@servercold)
Posts: 8
Active Member
Topic starter
 

@edsonbr, Boa Noite!

Conforme solicitado, segue agora uma cópia da Planilha Demo. Dentro do arquivo compactado existe um arquivo com as senhas de acesso a planilha.

Obs: Para simular o problema, acesse o Menu Principal e clique na opção Botão [Honorários], na TabDados clique no Botão [Formulário], será aberta a Tela de Registro de Honorários, já existe 5 registros de demonstração.

1) Nesta primeira tela do ListBox tudo está em plano funcionamento, se observar e clicar em qualquer registro os mesmos são exibidos no Form corretamente e todas as operações de Inclusão, Alteração e Excluir estão funcionando;

2) O PROBLEMA:

2.1) A inconsistência ocorre quando iremos utilizar a funcionalidade do campo Pesquisa, quando digitado o primeiro Caractereo sistema já esta fazendo a busca corretamente, porém ao clicar no resultado da busca os campos acima na 10 Colunas não consigo mais exibir no formulário com isso ocorre o erro, e o cabeçalho da ListBox fica em branco;

2.2) Comentei a linha abaixo justamente para tentar debbugar, pois o erro começa nela. 

'.List(linhalistbox, 10) = Sheets("TabDados").Cells(Linha, 11) -- erro começa aqui

 

Obrigado pela atenção

 
Postado : 16/03/2021 8:16 pm
(@srobles)
Posts: 231
Estimable Member
 

@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
(@servercold)
Posts: 8
Active Member
Topic starter
 

@srobles Boa Noite!

 

Muitíssimo obrigado pela atenção, sua lógica está certíssima, entendi o ponto de limitação quando utilizamos o método com Row.Source. Efetuei a mudança da seguinte forma abaixo e funcionou, só existe uma inconsistência aonde a última coluna não está sendo retornada ou seja a coluna SALDO TOTAL está listando vazia não entendi por qual motivo.

o que fiz:
1) Criei um novo módulo, e neste novo módulo28 inserir o seu código e acrescentei a linha bloqueado = True no cabeçalho e no final bloqueado = False;

2) No evento caixa_Filtro_Change() inserir o código abaixo e comentei todas as linhas de programação anterior. Com isso de fato resolveu sim, só não esta sendo exibido o campo SALDO FINAL, justamente porque na MATRIZ ela não foi iniciada e o cabeçalho que ficou em branco justamente como foi dito. Vou tentar analisar, mais se puder adiantar o motivo da inconsistência do SALDO FINAL não está sendo listado irei agradecer .

Private Sub caixa_Filtro_Change()

bloqueado = True

Call pesquisaProcesso(Me.caixa_Filtro)

bloqueado = False

End Sub

 
Postado : 19/03/2021 6:52 pm
(@srobles)
Posts: 231
Estimable Member
 

@servercold

Peço desculpas pela inconsistência. Após seu retorno que percebi um pequeno equívoco na seguinte linha contida na rotina que deixei.

Altere esta linha de :

colFim = .Cells(5, Columns.Count).End(xlToLeft).Column

Para:

colFim = .Cells(5, Columns.Count).End(xlToLeft).Column + 1

Assim, a coluna omitida será retornada conforme desejado.

Uma outra observação que deixo aqui é, experimente alterar a chamada a rotina AtualizaListBox (Call AtualizaListBox) no evento Initialize do Formulário para Call pesquisaProcesso("*"). Assim o ListBox será carregado da mesma maneira quando se utiliza o textbox caixa_Filtro, porém passando como parâmetro o coringa * (asterisco).

Espero ter ajudado.

Abs.

Saulo Robles

 
Postado : 20/03/2021 3:03 am
EdsonBR reacted
(@servercold)
Posts: 8
Active Member
Topic starter
 
Postado por: @srobles

@servercold

Peço desculpas pela inconsistência. Após seu retorno que percebi um pequeno equívoco na seguinte linha contida na rotina que deixei.

Altere esta linha de :

colFim = .Cells(5, Columns.Count).End(xlToLeft).Column

Para:

colFim = .Cells(5, Columns.Count).End(xlToLeft).Column + 1

Assim, a coluna omitida será retornada conforme desejado.

Uma outra observação que deixo aqui é, experimente alterar a chamada a rotina AtualizaListBox (Call AtualizaListBox) no evento Initialize do Formulário para Call pesquisaProcesso("*"). Assim o ListBox será carregado da mesma maneira quando se utiliza o textbox caixa_Filtro, porém passando como parâmetro o coringa * (asterisco).

Boa Noite, Saulo Robles! [RESOLVIDO]
Peço desculpas por não ter respondido de imediato.

Mais uma vez, obrigado! muito obrigado mesmo, por compartilhar esse conhecimento, ontem após ter postado essa nova solicitação consegui, debbugar e efetuei justamente essa alteração que voce solicitou abaixo, quando entrei no fórum e olhei a sua resposta fiquei mais tranquilo por sua confirmação.

Efetuei a outra alteração solicitada e funcionou também, vou analisar e colocar o cabeçalho pra ficar fixo também

Forte abraço, Saulo Robles!

 

 
Postado : 20/03/2021 8:12 pm
EdsonBR reacted