Vídeo recomendado
https://youtu.be/diWPPPhW-9E
https://youtu.be/diWPPPhW-9E
Filtro Pesquisa - ListBox - Erro ao retornar Dados no Form na 10 Coluna
-
- 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
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!
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!
Re: Filtro Pesquisa - ListBox - Erro ao retornar Dados no Form na 10 Coluna
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:
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á.
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
-
- 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
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
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: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á.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
- Anexos
-
- NOVA_VERSÃO_RegistroDeClientesEHonorários_VDemo__FILTRO_Mais10Colunas.rar
- (871.28 KiB) Baixado 161 vezes
Re: Filtro Pesquisa - ListBox - Erro ao retornar Dados no Form na 10 Coluna
@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 :
Para:
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).
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
Código: Selecionar todos
colFim = .Cells(5, Columns.Count).End(xlToLeft).Column + 1
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).
-
- 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]
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!
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 :Para:Código: Selecionar todos
colFim = .Cells(5, Columns.Count).End(xlToLeft).Column
Assim, a coluna omitida será retornada conforme desejado.Código: Selecionar todos
colFim = .Cells(5, Columns.Count).End(xlToLeft).Column + 1
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).