Vídeo recomendado
https://youtu.be/diWPPPhW-9E

Filtro Pesquisa - ListBox - Erro ao retornar Dados no Form na 10 Coluna

Fórum para dúvidas sobre os fundamentos da linguagem de programação Visual Basic no contexto do VBA
servercold
Acabou de chegar
Acabou de chegar
Mensagens: 3
Registrado em: Dom Jun 21, 2020 12:03 am

Filtro Pesquisa - ListBox - Erro ao retornar Dados no Form na 10 Coluna

Mensagem por servercold »

Boa Noite a Todos!

No sistema que estou desenvolvendo "Controle de Processo de Honorários Advocatícios". No Filtro de Pesquisa da ListBox após listar os clientes pela Primeira Letra informada utilizando o evento Change, ocorre o erro abaixo:

Erro em tempo de execução '380': Não foi possível obter a propriedade List. Valor de propriedade inválido.

Observações:
1) Quando não é utilizado o campo de pesquisa, selecionando qualquer cliente diretamente na ListBox, consigo efetuar todas as operações de: Inclusão, Alteração, e exclusão normalmente tudo funcionando perfeitamente;

2) Conforme já descrito acima o Problema só ocorre quando vou utilizar o campo de Pesquisa, além disso, o Cabeçalho não é listado;
A rotina de pesquisa está aqui: Private Sub caixa_Filtro_Change()

3) Retirei as senhas de abertura do arquivo e a senha de proteção do Projeto VBA. Será necessário apenas fazer Login no Sistema. Informe:
usuário: Adm
Senha: 123

4) Para simular o erro:
- Após acessar o sistema, no Menu Principal - clique na Opção [Honorários] em seguida clique no Botão [Formulários]
Fico no aguardo!


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


srobles
Jedi
Jedi
Mensagens: 805
Registrado em: Qua Mai 06, 2015 7:39 pm

Re: Filtro Pesquisa - ListBox - Erro ao retornar Dados no Form na 10 Coluna

Mensagem por srobles »

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 ou matrizes:

Código: Selecionar todos

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á.


servercold
Acabou de chegar
Acabou de chegar
Mensagens: 3
Registrado em: Dom Jun 21, 2020 12:03 am

Re: Filtro Pesquisa - ListBox - Erro ao retornar Dados no Form na 10 Coluna

Mensagem por servercold »

Boa Tarde, Saulo Robles!

Muito obrigado pela atenção, sua lógica está certíssima, entendi o ponto de limitação quando utilizamos o método 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.

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


srobles escreveu: Sex Mar 19, 2021 12:49 am 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 ou matrizes:

Código: Selecionar todos

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á.
Anexos
NOVA_VERSÃO_RegistroDeClientesEHonorários_VDemo__FILTRO_Mais10Colunas.rar
(871.28 KiB) Baixado 152 vezes


srobles
Jedi
Jedi
Mensagens: 805
Registrado em: Qua Mai 06, 2015 7:39 pm

Re: Filtro Pesquisa - ListBox - Erro ao retornar Dados no Form na 10 Coluna

Mensagem 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 :

Código: Selecionar todos

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

Código: Selecionar todos

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 da 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).


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


servercold
Acabou de chegar
Acabou de chegar
Mensagens: 3
Registrado em: Dom Jun 21, 2020 12:03 am

Re: Filtro Pesquisa - ListBox - Erro ao retornar Dados no Form na 10 Coluna [RESOLVIDO]

Mensagem por servercold »

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!


srobles escreveu: Sáb Mar 20, 2021 3:10 am @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 :

Código: Selecionar todos

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

Código: Selecionar todos

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 da 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).


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder