FILTRO LISTBOX COM TEXTBOX (ERROR 381)

 Tópico anterior Próximo tópico Novo tópico

FILTRO LISTBOX COM TEXTBOX (ERROR 381)

VB / VBA

 Compartilhe  Compartilhe  Compartilhe
#490353 - 06/09/2019 14:28:33

PABLOMOREIRAGV
GOVERNADOR VALADARES
Cadast. em:Julho/2010


Última edição em 09/09/2019 08:42:56 por PABLOMOREIRAGV

Olá,
        Estou fazendo um formulário de cadastro, onde eu clico em um item no Litsbox, e os dados são carregados no formulário com base em uma planilha. Tudo estava funcionando bem, até que eu fui fazer um filtro no listbox, com o que fosse digitado no campo NOME FANTASIA, e começou dar erro. O filtro funciona direitinho, mas ao clicar no item do listbox que deveria carregar o formulário vêm o erro. Queria que os dados fossem carregados nos campos como antes, só que agora, sejam as informações do item filtrado. Estou postando um imagnes exemplo, e abaixo os códigos que estão atualmente nos controles. Desde já agradeço.

Mensagem de Erro: ERRO EM TEMPO DE EXECUÇÃO 381: Não foi possível obter a propriedade List. Índice de matriz de propriedade inválido.

Código do Textbox que faz o filtro no Listbox

Private Sub txt_nome_fantasia_Change()
    Dim guia As Worksheet
    Dim linha As Integer
    Dim coluna As Integer
    Dim linhalistbox As Integer
    Dim valor_celula As String
    Dim conta_registros As Integer
    Dim valor_pesquisado As String
    Dim produtos
    Set guia = ThisWorkbook.Worksheets("Fornecedor")
    
    valor_pesquisado = Me.txt_nome_fantasia.Text
    
    linha = 3
    coluna = 6
    linhalistbox = 0
    conta_registros = 0
    
    Me.ListBox2.Clear
    
    With guia
        While .Cells(linha, coluna).Value <> Empty
            valor_celula = .Cells(linha, coluna).Value
            
            If UCase(Left(valor_celula, Len(valor_pesquisado))) = UCase(valor_pesquisado) Then
                
             With Me.ListBox2
             .AddItem
             .List(linhalistbox, 0) = Sheets("Fornecedor").Cells(linha, 1)
             .List(linhalistbox, 1) = Sheets("Fornecedor").Cells(linha, 2)
             .List(linhalistbox, 2) = Sheets("Fornecedor").Cells(linha, 3)
             .List(linhalistbox, 3) = Sheets("Fornecedor").Cells(linha, 4)
             .List(linhalistbox, 4) = Sheets("Fornecedor").Cells(linha, 5)
             .List(linhalistbox, 5) = Sheets("Fornecedor").Cells(linha, 6)
             .List(linhalistbox, 6) = Sheets("Fornecedor").Cells(linha, 7)
             .List(linhalistbox, 7) = Sheets("Fornecedor").Cells(linha, 8)
             .List(linhalistbox, 8) = Sheets("Fornecedor").Cells(linha, 9)
             .List(linhalistbox, 9) = Sheets("Fornecedor").Cells(linha, 10)
            
            
              linhalistbox = linhalistbox + 1
             conta_registros = conta_registros + 1
             End With
                
            End If
            linha = linha + 1
        Wend
    End With
'    filtro2 ' chama o procedimento segundo filtro que mostra o código da empresa' segundo filtro que mostra o código da empresa
    produtos = conta_registros & "  Produtos Cadastrados"
End Sub

=====================================================================================

Código do Listbox que carrega os campos do formuláro

Private Sub ListBox2_Change()

txt_cod_sap.Text = ListBox2.List(ListBox2.ListIndex, 0)
txt_status.Text = ListBox2.List(ListBox2.ListIndex, 1)
txt_cnpj.Text = ListBox2.List(ListBox2.ListIndex, 2)
txt_razao_social.Text = ListBox2.List(ListBox2.ListIndex, 3)
txt_nome_fantasia.Text = ListBox2.List(ListBox2.ListIndex, 4)
txt_insc_estadual.Text = ListBox2.List(ListBox2.ListIndex, 5)
txt_email.Text = ListBox2.List(ListBox2.ListIndex, 6)
cbx_ramo.Text = ListBox2.List(ListBox2.ListIndex, 7)
txt_nome_contato.Text = ListBox2.List(ListBox2.ListIndex, 8)
txt_contato_fone.Text = ListBox2.List(ListBox2.ListIndex, 9)
txt_logradouro.Text = ListBox2.List(ListBox2.ListIndex, 12)
txt_cidade.Text = ListBox2.List(ListBox2.ListIndex, 13)
cbx_recibo.Text = ListBox2.List(ListBox2.ListIndex, 14)
cbx_pagamento.Text = ListBox2.List(ListBox2.ListIndex, 15)
cbx_prazo.Text = ListBox2.List(ListBox2.ListIndex, 16)
    
End Sub





Pablo Moreira

#490373 - 10/09/2019 01:14:54

JABA
CABO FRIO
Cadast. em:Agosto/2005


Cara, difícil apurar onde está o erro. O erro está dizendo que o objeto que está sendo manipulado não contém a propriedade List. Não tenho certeza, mas me parece que esse objeto é o guia(Worksheet). Uma outra coisa provável que possa estar levando a esse erro é que você está declarando suas variáveis dentro do evento change. Com isso, elas estão sendo limpadas toda vez que você pressiona uma tecla nessa caixa de texto.


_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#490376 - 10/09/2019 09:22:58

PABLOMOREIRAGV
GOVERNADOR VALADARES
Cadast. em:Julho/2010


Última edição em 10/09/2019 09:26:46 por PABLOMOREIRAGV

 Anexos estao visíveis somente para usuários registrados

Segue modelo do que estou fazendo. Ela é de meu uso pessoal. Veja que a medida em que se preenche o campo NOME FANTASIA, o listbox aplica o filtro. O que eu queria, era que depois de filtrado, ao clicar no item do listbox, os campos TEXTBOX's sejam preenchidos. Só que ao fazer isso, vêm o erro. Antes de inserir o código do filtro, o preenchimento funcionava normalmente, mas, preciso do filtro pois são muitos fornecedores para encontrar.

Obrigado


Pablo Moreira

Resposta escolhida #490407 - 12/09/2019 13:56:40

FILMAN
PRESIDENTE PRUDENTE
Cadast. em:Março/2010


 Anexos estao visíveis somente para usuários registrados

Pablo, o erro origina no CHANGE do seu campo NOME_FANTASIA, pois o mesmo está sendo modificado, você pode tratar isso com uma variável.

'Essa declaração é no General do FORM. Junto com as demais do já declaradas no Option Explicit
Private bPesquisouClicou As Boolean



Private Sub txt_nome_fantasia_Change()
    Dim guia As Worksheet
    Dim linha As Integer
    Dim coluna As Integer
    Dim linhalistbox As Integer
    Dim valor_celula As String
    Dim conta_registros As Integer
    Dim valor_pesquisado As String
    Dim produtos
    
    If bPesquisouClicou = False Then
        'Todo o código aqui
    End If
End Sub


'O evento CHANGE do LISTBOX2 copie o código e deixe dentro do evento DBLCLICK atribuindo a variável criada
Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    bPesquisouClicou = True
    
    If Me.ListBox2.ListIndex >= 0 Then
        txt_cod_sap.Text = ListBox2.List(ListBox2.ListIndex, 0)
        txt_status.Text = ListBox2.List(ListBox2.ListIndex, 1)
        txt_cnpj.Text = ListBox2.List(ListBox2.ListIndex, 2)
        txt_razao_social.Text = ListBox2.List(ListBox2.ListIndex, 3)
        txt_nome_fantasia.Text = ListBox2.List(ListBox2.ListIndex, 4)
        txt_insc_estadual.Text = ListBox2.List(ListBox2.ListIndex, 5)
        txt_email.Text = ListBox2.List(ListBox2.ListIndex, 6)
        cbx_ramo.Text = ListBox2.List(ListBox2.ListIndex, 7)
        txt_nome_contato.Text = ListBox2.List(ListBox2.ListIndex, 8)
        txt_contato_fone.Text = ListBox2.List(ListBox2.ListIndex, 9)
        'txt_logradouro.Text = ListBox2.List(ListBox2.ListIndex, 12)
        'txt_cidade.Text = ListBox2.List(ListBox2.ListIndex, 13)
        'cbx_recibo.Text = ListBox2.List(ListBox2.ListIndex, 14)
        'cbx_pagamento.Text = ListBox2.List(ListBox2.ListIndex, 15)
        'cbx_prazo.Text = ListBox2.List(ListBox2.ListIndex, 16)
    End If

    bPesquisouClicou = False
End Sub


* Remover os eventos CHANGE e CLICK da LISTBOX2

No CHANGE do Textbox NOME_FANTASIA, você atribui somente 10 colunas, mas na hora de preencher os campos do FORM você está tentando buscar mais indexação do que existe na LISTBOX2. Isso faz com que apresente erro no código devido o processo estar estourando o índice da capacidade do LIST. Nesse caso os campos acima comentado dentro do código DBLCLICK, deixariam de existir no DBLCLICK, mas se você corrigir o CHANGE do NOME_FANTASIA, pode ser que resolva.


Caso possua métodos que são genéricos eu sugiro que faça eles em um módulo para que seu FORM tenha somente códigos que realmente precise dentro dele, e também os código comentados se não for utiliza-los é bom remover para deixar mais limpo seu código.

Segue planilha modificada.


  
  
Instruir-te-ei, e ensinar-te-ei o caminho que deves seguir; guiar-te-ei com os meus olhos. (Salmos 32:8)

www.cursoexcelvba.com.br

#490409 - 12/09/2019 15:28:09

PABLOMOREIRAGV
GOVERNADOR VALADARES
Cadast. em:Julho/2010


Obrigado FILMAN, funcionou certinho... agradeço muito ....

abs...

Pablo Moreira

 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por PABLOMOREIRAGV em 12/09/2019 15:28:25