O artigo de hoje faz parte da série de artigos Aprendendo VBA que te ensinará como criar um Formulário de Pesquisa com VBA.
Você aprenderá como Formulário de Pesquisa com 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.
Formulário de Pesquisa com VBA
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:
- Base de Dados
- Montagem do Layout do Formulário e interação com os componentes
- Criação do Algoritimo de Pesquisa e Exibição dos dados.
- 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.
2 – Montagem do Layout do Formulário de Pesquisa com VBA
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 de Pesquisa com VBA:
Ambiente de Programação do VBA: ALT +F11.
Para que você consiga montar seu Formulário de Pesquisa com VBA 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:
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:
- Menu – Inserir / Insert
- Formulário / UserForm
- 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.
- Formulário em branco onde devem ser inseridos os componentes
- Caixa de Ferramentas, nela que selecionaremos os componentes do formulário.
- Janela de Propriedades, nela trocamos os nomes e todas propriedades dos componentes.
Montagem do Formulário de Pesquisa com VBA: 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:
- Caixas de Texto / TextBox = Recebem os valores para realizar a pesquisa
- Rótulos / Labels = São os títulos que ficam sobre os campos
- Botões de Comando / Command Buttons = Botões que realizarão ações
- Listview = Exibirá os resultados da busca dentro do Formulário
- Janela de Propriedades onde iremos renomear os campos conforme abaixo.
Dando nomes para os componentes do Formulário de Pesquisa com VBA
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 do Formulário de Pesquisa com VBA.
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() 'Formulário de Pesquisa com VBA '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() 'Formulário de Pesquisa com VBA '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ário de Pesquisa com VBA 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
Oi, Douglas, Bom dia,
Quais os códigos que uso para, ao criar o Botão: Atualizar e Excluir, depois dar dar 2 cliques no registro na LIstVIew? (y)
me envie a planilha no e-mail.
Douglas meu caro mestre.
Eu tenho recebido a seguinte mensagem:
“Compile error: Variable not defined”
Private Sub bt_pesquisa_Click()
‘Formulário de Pesquisa com VBA
‘Variáveis recebendo o valor dos campos
estado = Me.txt_estado.Value
nome = Me.txt_nome.Value
cidade = Me.txt_cidade.Value
Como faz para Definir “estado”, “nome” e “cidade”?
muito obrigado
Carlos,
Se a variável for de texto você deve declarar ela como String.
Para definir a variável use Dim, estado, nome, cidade As String.
Abraços
DG
Excelente aula Douglas.
Olá! Obrigado pela excelente aula! Aprendendo muito nesse canal
Tenho uma dúvida, como faço para ao clicar em limpar, na listView limpar também? Ou seja, retirar os filtros e também a tela ficar branca em todos os campos e listas?
Muito obrigado, vi que respondeu minha pergunta no seu canal no YouTube! Fiz conforme sua resposta e funcionou perfeitamente! Fico agradecido! Sucesso e que a misericórdia e graça do Senhor estejam sempre sobre sua vida, te capacitando mais e mais! Abraço!
Agradeço demais pelo seu feedback Rogerinho, sempre que precisar fico a disposição. Forte abraço!
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
Olá Regiane, consegue me disponibilizar a planilha? douglas@douglasgodoy.com.br ai te envio o que pode ser e a solução.
criterial:= você está utilizando o L no lugar do 1 “criteria1:=”, Talvez seja esse o problema amigo.
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
Pingback: Textbox que aceita apenas Números - Aprenda Excel e VBADouglas Godoy
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.
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
Parabéns!
Ajuda muito a muitos profissionais..
Olá Denir,
Muito obrigado pela visita e pelo comentário!
Abs
Douglas
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
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
Oi, Douglas, Bom dia,
Quais os códigos que uso para, ao criar o Botão: Atualizar e Excluir, depois dar dar 2 cliques no registro na LIstVIew?