Formulário de Pesquisa com VBA

O artigo de hoje faz parte da série de artigos Aprendendo VBA, e te ensinará a criar um Formulário de Pesquisa com VBA.

Você aprenderá como Criar um Formulário de Pesquisa com o VBA a partir do Zero, mesmo se você não tiver muito conhecimento em VBA se você seguir o passo a passo e assistir a vídeo aula você conseguirá com certeza fazer o seu formulário também.

Muitas vezes temos a necessidade de ter um mecanismo de busca de informações e exibições destas informações em nossos sistemas desenvolvidos em Excel e VBA, para isso o artigo abaixo te dá o passo a passo do que você precisará para conseguir construir o seu formulário de pesquisa.

Vídeo Aula Completa!!!

Caso você precise de mais detalhes segue o passo a passo abaixo:

Este projeto é dividido em algumas etapas para facilitar a compreensão e realização da construção passo a passo.

Etapas do Projeto:

  1. Base de Dados
  2. Montagem do Layout do Formulário e interação com os componentes
  3. Criação do Algoritimo de Pesquisa e Exibição dos dados.
  4. Revisão e Testes.

1 – Base de Dados – Formulário de Pesquisa

Para que o seu projeto funcione você precisará ter uma base de dados, nesta base de dados que o mecanismo de busca irá atuar, podemos chamar de base de dados uma Sheet/Aba de cadastros de clientes com campos como Nome, Estado, Cidade entre outros…

A imagem abaixo tem como exemplo uma base de dados com os campos, CIDADE, ESTADO, NOME DO CLIENTE.

Base de Dados - Formulário de Pesquisa com VBA

2 – Montagem do Layout do Formulário

Para a montagem do Formulário de Pesquisa utilizaremos, um Formulário (UserForm), 3 caixas de texto (textbox), 3 Rótulos(Labels), 2 Botões de Comando (Command  Buttons), 1 Listview.

Sabendo quais são os componentes que vamos utilizar vamos montar o nosso Layout conforme a imagem abaixo…

Perspectivava Final do Formulário:

Formulário de Pesquisa - Layout


Ambiente de Programação do VBA: ALT  +F11.

Para que você consiga montar seu formulário de pesquisa você deverá acessar o ambiente do VBA, através do menu Desenvolvedor ou com as teclas de atalho: ALT +F11.

Já no ambiente de programação do VBA você terá acesso a uma tela semelhante a que é exibida abaixo:

Formulário de Pesquisa VBA

Inserindo um Formulário

Após ter acesso ao console do Visual Basic For Applications na tela acima você deverá criar o seu formulário conforme a imagem abaixo mostra:

  1. Menu – Inserir / Insert
  2. Formulário / UserForm
  3. Onde será exibido o seu formulário e todos os componentes

Após realizar a etapa de inserir o formulário você visualizará uma imagem semelhante a abaixo, com um formulário em branco sem campos e sem funcionalidades programadas.

  1. Formulário em branco onde devem ser inseridos os componentes
  2. Caixa de Ferramentas, nela que selecionaremos os componentes do formulário.
  3. Janela de Propriedades, nela trocamos os nomes e todas propriedades dos componentes.

Montagem do Formulário: Layout

Para a montagem do Formulário de Pesquisa utilizaremos, um Formulário (UserForm), 3 caixas de texto (textbox), 3 Rótulos(Labels), 2 Botões de Comando (Command  Buttons), 1 Listview.

Sabendo quais são os componentes que vamos utilizar vamos montar o nosso Layout conforme a imagem abaixo:

  1. Caixas de Texto / TextBox = Recebem os valores para realizar a pesquisa
  2. Rótulos / Labels = São os títulos que ficam sobre os campos
  3. Botões de Comando / Command Buttons = Botões que realizarão ações
  4. Listview = Exibirá os resultados da busca dentro do Formulário
  5. Janela de Propriedades onde iremos renomear os campos conforme abaixo.

Dando nomes para os componentes do Formulário

Na montagem do Layout é necessário dar nomes aos componentes que colocamos nos formulário, isso facilita na hora que precisamos identificar cada componente e também quando vamos atribuir ou capturar o valor de cada campo ou componente do nosso formulário.

Para os componentes do nosso formulário vamos dar os seguintes nomes, alterando a propriedade NAME na janela de propriedades:

txt_nome =  Campo que receberá o NOME do cliente para a pesquisa.
txt_cidade =  Campo que receberá o CIDADE do cliente para a pesquisa.
txt_estado =  Campo que receberá o ESTADO do cliente para a pesquisa.
bt_limpar = Botão com a função de resetar a pesquisa e retonar os valores originais.
bt_pesquisa = Botão que executa o código de filtragem no formulário.
Listview1 = Componente que recebe os valores da busca.

Criação do Algoritimo de Pesquisa e Exibição dos dados.

Com os campos renomeados é hora de colocarmos a mão na massa e partirmos para a programação do código que faz a filtragem dos campos e ações de busca.

Mas antes disse é importante se certificar que a sua base de dados está com filtros, se ela não estiver selecione os campos que deseja filtrar e aperte CRTL + SHIFT + L que o filtro será habilitado, após isso siga para os passos abaixo:

Carregamento das informações ao iniciar o formulário:

Private Sub UserForm_Initialize()

    With ListView1
    
        .BorderStyle = ccFixedSingle
        .Gridlines = True
        .View = lvwReport
        .FullRowSelect = True
        .ColumnHeaders.Add Text:="Cidade.", Width:=100
        .ColumnHeaders.Add Text:="Estado", Width:=50, Alignment:=2
        .ColumnHeaders.Add Text:="Nome", Width:=80, Alignment:=2
       
    End With

ListView1.ListItems.Clear

'Adiciona os dados a listview2

Sheets("Plan1").Select
 lin = 2
        
        Do Until Sheets("Plan1").Cells(lin, 1) = ""
                        
        Set li = ListView1.ListItems.Add(Text:=Sheets("Plan1").Cells(lin, 1).Value)
        li.ListSubItems.Add Text:=Sheets("Plan1").Cells(lin, 2).Value
        li.ListSubItems.Add Text:=Sheets("Plan1").Cells(lin, 3).Value
        lin = lin + 1
    
    Loop
    
    lbl_registros = Me.ListView1.ListItems.Count
    
End Sub

No Formulário clique no seu botão “BUSCAR” 2x e insira o código abaixo:

Private Sub bt_pesquisa_Click()

'Variáveis recebendo o valor dos campos
estado = Me.txt_estado.Value
nome = Me.txt_nome.Value
cidade = Me.txt_cidade.Value

'Mecanismo de filtragem
ActiveSheet.Range("$A$1:$C$12").AutoFilter Field:=1, Criteria1:="=*" & cidade & "*"
ActiveSheet.Range("$A$1:$C$12").AutoFilter Field:=2, Criteria1:="=*" & estado & "*"
ActiveSheet.Range("$A$1:$C$12").AutoFilter Field:=3, Criteria1:="=*" & nome & "*"

'Limpando os dados da Listview antes de exibir a filtragem
ListView1.ListItems.Clear

'Adiciona os dados a listview
Sheets("Plan1").Select
 lin = 2
        
        Do Until Sheets("Plan1").Cells(lin, 1) = ""
                        
        If Cells(lin, 1).Rows.Hidden = False Then
                        
Set li = ListView1.ListItems.Add(Text:=Sheets("Plan1").Cells(lin, 1).Value) 'Cod
             li.ListSubItems.Add Text:=Sheets("Plan1").Cells(lin, 2).Value 'Nome
             li.ListSubItems.Add Text:=Sheets("Plan1").Cells(lin, 3).Value 'Canal
        End If
        
        lin = lin + 1
    
    Loop

End Sub

No Formulário clique no seu botão “LIMPAR” 2x e insira o código abaixo:

Private Sub bt_limpar_Click()

'Desabilita o filtro da base de dados
ActiveSheet.ShowAllData

'Limpa os dados da Listview
ListView1.ListItems.Clear

'Adiciona os dados a listview2
Sheets("Plan1").Select
 lin = 2
        
        Do Until Sheets("Plan1").Cells(lin, 1) = ""
                        
        If Cells(lin, 1).Rows.Hidden = False Then
                        
Set li = ListView1.ListItems.Add(Text:=Sheets("Plan1").Cells(lin, 1).Value) 'Cod
             li.ListSubItems.Add Text:=Sheets("Plan1").Cells(lin, 2).Value 'Nome
             li.ListSubItems.Add Text:=Sheets("Plan1").Cells(lin, 3).Value 'Canal
        End If
        
        lin = lin + 1
    
    Loop
    
    lbl_registros = Me.ListView1.ListItems.Count
    
End Sub

Esta é apenas uma forma de realizar uma busca com formulários no Excel.

Caso você tenha interesse em aprender como CRIAR UM FORMULÁRIO DE CADASTRO acesse o link abaixo:
http://douglasgodoy.com.br/vba-aprenda-criar-formulario-de-cadastro/

Espero que você tenha aprendido coisas novas nesta aula e saia com ainda mais conhecimento.

Se você ainda tiver dúvidas me escreva e se inscreva no canal para receber as aulas novas.

Ah, e se você quiser a planilha, se inscreva no canal e comenta lá no video com seu email que te envio.

Um abraço!

Douglas Godoy

Comentários

  • Regiane Prado
    Responder

    Olá Douglas
    td bem?

    Estou tendo um problema ao rodar a macro PESQUISAR/BUSCAR.

    Verifiquei cada item do comando e esta correto, você poderia por favor me ajudar com isso:

    A linha que esta dando erro é essa: ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=1, criterial:=”=*” & numero & “*”

    E o erro que aparece é esse: Erro em tempo de execução ‘1004’: Erro de definição de aplicativo ou de definição de objeto

    Segue abaixo o comando completo da VBA:

    Private Sub bt_buscar_Click()

    ‘Variáveis recebendo o valor dos campos
    numero = Me.txt_numero.Value
    cliente = Me.txt_cliente.Value
    contato = Me.txt_contato.Value
    tipo = Me.lista_tipo.Value
    Email = Me.txt_email.Value
    nomeobra = Me.txt_nomeobra.Value
    bairro = Me.txt_bairro.Value
    cidade = Me.txt_cidade.Value
    uf = Me.txt_uf.Value
    vendedor = Me.txt_vendedor.Value
    tiposolicitação = Me.lista_tiposolicit.Value
    statusorçamento = Me.lista_status.Value

    ‘Mecanismo de filtragem
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=1, criterial:=”=*” & numero & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=2, criterial:=”=*” & cliente & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=3, criterial:=”=*” & contato & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=4, criterial:=”=*” & tipo & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=8, criterial:=”=*” & Email & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=9, criterial:=”=*” & nomeobra & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=10, criterial:=”=*” & bairro & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=11, criterial:=”=*” & cidade & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=12, criterial:=”=*” & uf & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=16, criterial:=”=*” & vendedor & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=17, criterial:=”=*” & tiposolicit & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=26, criterial:=”=*” & Status & “*”

    ‘Limpando os dados da Listview antes de exibir a filtragem
    ListView1.ListItems.Clear

    ‘Adiciona os dados a listview
    Sheets(“BASE”).Select
    lin = 2

    Do Until Sheets(“BASE”).Cells(lin, 1) = “”

    If Cells(lin, 1).Rows.Hidden = False Then

    Set li = ListView1.ListItems.Add(Text:=Sheets(“BASE”).Cells(lin, 1).Value) ‘numero
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 2).Value ‘cliente
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 3).Value ‘contato
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 4).Value ‘tipo
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 8).Value ‘email
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 9).Value ‘nomeobra
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 10).Value ‘bairro
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 11).Value ‘cidade
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 12).Value ‘uf
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 16).Value ‘vendedor
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 17).Value ‘tiposolicit
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 26).Value ‘status

    End If

    lin = lin + 1

    Loop

    End Sub

    aguardo seu retorno;
    obrigada

  • Regiane Prado
    Responder

    Olá Douglas td bem?

    Não estou conseguindo executar o comando ‘pesquisar’, pois esta apontando erro.

    Não sei o que há de errado pois coloquei tudo conforme você orientou.

    Aparece o erro:

    Erro em tempo de execução ‘1004’:
    Erro de definição de aplicativo ou definição de objeto

    O comando utilizado por mim, foi este:

    Private Sub Preencher_Listbox_Click()

    ‘Variáveis recebendo o valor dos campos
    numero = Me.txt_numero.Value
    cliente = Me.txt_cliente.Value
    contato = Me.txt_contato.Value
    tipo = Me.lista_tipo.Value
    Email = Me.txt_email.Value
    nomeobra = Me.txt_nomeobra.Value
    bairro = Me.txt_bairro.Value
    cidade = Me.txt_cidade.Value
    uf = Me.txt_uf.Value
    vendedor = Me.txt_vendedor.Value
    tiposolicitação = Me.lista_tiposolicit.Value
    statusorçamento = Me.lista_status.Value

    ‘Mecanismo de filtragem
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=1, criterial:=”=*” & numero & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=2, criterial:=”=*” & cliente & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=3, criterial:=”=*” & contato & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=4, criterial:=”=*” & tipo & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=8, criterial:=”=*” & Email & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=9, criterial:=”=*” & nomeobra & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=10, criterial:=”=*” & bairro & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=11, criterial:=”=*” & cidade & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=12, criterial:=”=*” & uf & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=16, criterial:=”=*” & vendedor & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=17, criterial:=”=*” & tiposolicit & “*”
    ActiveSheet.Range(“$A$1:$Z$50026″).AutoFilter Field:=26, criterial:=”=*” & Status & “*”

    ‘Limpando os dados da Listview antes de exibir a filtragem
    ListView1.ListItems.Clear

    ‘Adiciona os dados a listview
    Sheets(“BASE”).Select
    lin = 2

    Do Until Sheets(“BASE”).Cells(lin, 1) = “”

    If Cells(lin, 1).Rows.Hidden = False Then

    Set li = ListView1.ListItems.Add(Text:=Sheets(“BASE”).Cells(lin, 1).Value) ‘numero
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 2).Value ‘cliente
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 3).Value ‘contato
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 4).Value ‘tipo
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 8).Value ‘email
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 9).Value ‘nomeobra
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 10).Value ‘bairro
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 11).Value ‘cidade
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 12).Value ‘uf
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 16).Value ‘vendedor
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 17).Value ‘tiposolicit
    li.ListSubItems.Add Text:=Sheets(“BASE”).Cells(lin, 26).Value ‘status

    End If

    lin = lin + 1

    Loop

    End Sub

  • André Assumpção
    Responder

    Boa tarde Douglas.

    Segui os passos e consegui adaptar a minha realidade. Ficou muito bom, porém, gostaria de tirar algumas dúvidas:

    1 – Quando clico no botão Limpar, sem pesquisa feita, retorna um erro:

    Erro em tempo de execução ‘1004’:
    O método ShowAllData da classe Worksheet falhou.

    2 – Queria alterar o formato de horário exibido no resultado dentro do formulário

    3 – Tem como o resultado só ser alterado no formulário e não alterar a visualização da planilha?

    Desculpe o aluguel, mas a pesquisa ficou boa e gostaria de implementar nas minhas planilhas.

    Obrigado.

    • Douglas Godoy

      Olá André,

      Obrigado pelo comentário!

      1 – Para resolver este problema, antes da linha que executa o método ShowAllData coloque o seguinte…

      On error resume next
      ActiveSheet.ShowAllData

      O que isso faz? Em caso de erro vá para a próxima linha… O método ShowAllData exibe todas as linhas da planilha, porém como não tem filtro nenhum ele dá um conflito e este erro…

      2 -Teria sim, basta você usar o comando Format(), ficaria mais ou menos assim Format(Sheets(“Plan1”).Cells(lin, 2).Value,”hh:mm”) ou Format(txt_hora.value,”hh:mm”)

      3 – Tem sim como só alterar o formulário, basta que não seja executada a função de salvar, não sei se é isso que quer saber, se não for me envie outra msg…

      Que bom que deu certo e ficou boa, estou aqui para o que precisar.

      Abs
      Douglas

  • Denir
    Responder

    Parabéns!
    Ajuda muito a muitos profissionais..

    • Douglas Godoy

      Olá Denir,

      Muito obrigado pela visita e pelo comentário!

      Abs
      Douglas

  • Alexandre
    Responder

    Boa tarde Douglas!

    Desculpe lhe incomodar, fui igual as informações passadas acima, porém quando coloco pra rodar a planilha da o seguinte erro:

    Erro em tempo de execução ‘9’:
    Subscrito fora do intervalo

    Já tentei algumas correções porém sem sucesso, se pode me auxiliar te agradeço

    • Douglas Godoy

      Olá Alexandre,

      Tente se atentar que ao rodar o formulário direto pelo console do VBA você esteja na planilha que é referenciada, pois ele vai buscar os dados e fazer a busca na planilha, e se você estiver com outra planilha clicada ele vai dar erros como este… Faça o teste e depois nos sinalize.

      Abs