Oi pessoal. Hoje vamos criar uma pesquisa personalizada bem simples com base no comando Localizar do excel. Nessa pesquisa, os dados retornados serão exibidos num formulário.
Vamos começar então.
Tendo em mãos uma planilha simples:
| Nome | Estado | Função | Status |
| Marcelle Silva | Rio de Janeiro | Técnica | Ativo |
| Cláudia Mara | Goiás | Técnica | Ativo |
| Ricardo Teles | Minas Gerais | Supervisor | Ativo |
| James Wood | Rio de Janeiro | Técnico | Férias |
| Aline Aguiar Moraes | Bahia | Técnica | Ativo |
| Cláudia Moraes Lima | Rio Grande do Sul | Gerente Executiva | Ativo |
| Marcelo de Souza | Rio de Janeiro | Supervisor | Aposentado |
| Maria Antonieta | Bahia | Secretária | Férias |
| Jackie Wistern | Bahia | Técnico | Ativo |
Temos, assim, quatro colunas: nome, estado, função e status. Adicione um botão de comando nessa planilha, definindo seu caption como “Localizar na Planilha”. Dê um duplo clique nesse controle para abrir o evento Click no ambiente VBA e podermos editá-lo. Quando abrir, digite isso:
Private Sub CommandButton1_Click()
frmBusca.Show False 'Exibe o Formulário da Pesquisa
End Sub
Bom, agora, adicione um formulário (Menu Inserir > UserForm) e dê o nome “frmBusca”.
Adicione a ele 5 TextBox, 8 Label, 1 CommandButton e 1 SpinButton. O formulário deve ficar parecido com este:
Defina os seguintes nomes aos controles:
CommandButton = btn_Procurar
SpinButton = SpinButton1
Label que vai mostrar a posição do registro atual = Label_Registros_Contador (Os demais Labels não precisa alterar os nomes)
Textbox onde vai digitar o termo da pesquisa = txt_Procurar (Os demais textbox deixe como TextBox1, TextBox2, TextBox3 e TextBox4)
Após ajustar o design do formulário, tecle F7 para exibir o seu código e declare as duas variáveis públicas abaixo:
Public MatrizResultados As Variant
Public Total_Ocorrencias As Long
Em seguida, crie a sub-rotina que executará a pesquisa no formulário:
Private Sub ProcuraPersonalizada(ByVal TermoPesquisado As String)
Dim Busca As Range
Dim Primeira_Ocorrencia As String
Dim Resultados As String
'Executa a busca
Set Busca = Plan1.Cells.Find(What:=TermoPesquisado, After:=Plan1.Range("A1"), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
'Caso tenha encontrado alguma ocorrência...
If Not Busca Is Nothing Then
Primeira_Ocorrencia = Busca.Address
Resultados = Busca.Row 'Lista o primeiro resultado na variavel
'Neste loop, pesquisa todas as próximas ocorrências para
'o termo pesquisado
Do
Set Busca = Plan1.Cells.FindNext(After:=Busca)
'Condicional para não listar o primeiro resultado
'pois já foi listado acima
If Not Busca.Address Like Primeira_Ocorrencia Then
Resultados = Resultados & ";" & Busca.Row
End If
Loop Until Busca.Address Like Primeira_Ocorrencia
MatrizResultados = Split(Resultados, ";")
'Atualiza dados iniciais no formulário
SpinButton1.Max = UBound(MatrizResultados) 'Valor maximo do seletor de registros
'habilita o seletor de registro
SpinButton1.Enabled = True
'indicador do seletor de registros
Label_Registros_Contador.Caption = "1 de " & UBound(MatrizResultados) + 1
'Box com o conteudo encontrado
TextBox1.Text = Plan1.Cells(MatrizResultados(0), 1).Value
TextBox2.Text = Plan1.Cells(MatrizResultados(0), 2).Value
TextBox3.Text = Plan1.Cells(MatrizResultados(0), 3).Value
TextBox4.Text = Plan1.Cells(MatrizResultados(0), 4).Value
Else 'Caso nada tenha sido encontrado, exibe mensagem informativa
SpinButton1.Enabled = False 'desabilita o seletor de registros
Label_Registros_Contador.Caption = "" 'zera os resultados encontrados
'limpa os campos do formulário
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
MsgBox "Nenhum resultado para '" & TermoPesquisado & "' foi encontrado."
End If
End Sub
Feito isso, falta criar os procedimentos a serem executados ao abrir o formulário, ao clicar no botão pesquisar e ao clicar nos botões que percorrem os resultados obtidos. Segue abaixo esse códigos nesta ordem:
Private Sub UserForm_Initialize()
SpinButton1.Enabled = False
Label_Registros_Contador.Caption = ""
End Sub
Private Sub btn_Procurar_Click()
If Me.txt_Procurar.Text = "" Then
MsgBox "Digite um valor para a pesquisa"
Else
Call ProcuraPersonalizada(Me.txt_Procurar.Text)
End If
End Sub
Private Sub SpinButton1_Change()
Dim Linha As Long
Dim TotalOcorrencias As Long
TotalOcorrencias = SpinButton1.Max + 1
Linha = MatrizResultados(SpinButton1.Value)
Label_Registros_Contador.Caption = SpinButton1.Value + 1 & " de " & TotalOcorrencias
TextBox1.Text = Plan1.Cells(Linha, 1).Value
TextBox2.Text = Plan1.Cells(Linha, 2).Value
TextBox3.Text = Plan1.Cells(Linha, 3).Value
TextBox4.Text = Plan1.Cells(Linha, 4).Value
End Sub
Pronto. Após todos os códigos digitados, basta acessar a planilha, clicar no botão “Localizar na Planilha”, digitar o texto que deseja encontrar e será exibido nos campos do formulário todas as ocorrências obtidas na consulta.
Um abraço a todos.
Termos aprendidos neste artigo:
| Find | Localiza informações especÃficas em um intervalo, e retorna um objeto Range representando a primeira célula onde essas informações se encontram. Retorna Nothing se nenhuma coincidência for encontrada. Não afeta a seleção da célula ativa.
expressão.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat) expressão necessária. Uma expressão que retorna um objeto Range. What Variant necessário. Os dados a serem procurados. Pode ser uma seqüência de caracteres ou qualquer tipo de dados do Microsoft Excel. After Variant opcional. A célula depois da qual você deseja que a pesquisa comece. Corresponde à posição da célula ativa quando uma pesquisa é feita a partir da interface do usuário. Observe que After precisa ser uma única célula no intervalo. Lembre-se de que a pesquisa começa depois dessa célula; a célula especificada não é pesquisada até que o método dê a volta e chegue a ela. Se você não especificar esse argumento, a pesquisa começará após a célula do canto superior esquerdo do intervalo. LookIn Variant opcional. O tipo de informação. LookAt Variant opcional. Pode ser uma das seguintes constantes XlLookAt:  xlWhole ou xlPart. SearchOrder Variant opcional. Pode ser uma das seguintes constantes XlSearchOrder:  xlByRows ou xlByColumns. SearchDirection XlSearchDirection opcional. A direção da pesquisa.
MatchCase Variant opcional. True para fazer a pesquisa fazer distinção entre maiúsculas e minúsculas. O valor padrão é False. MatchByte Variant opcional. Usado somente se você tiver selecionado ou instalado suporte de linguagem de byte duplo. True para que os caracteres de dois bytes coincidam somente com caracteres de dois bytes. False para que os caracteres de dois bytes coincidam com seus equivalentes de um byte. SearchFormat Variant opcional. O formato da pesquisa |
||||
| FindNext | Continua uma pesquisa que tenha começado com o método Find. Localiza a próxima célula que coincida com as mesmas condições e retorna um objeto Range representando essa célula. Não afeta a seleção da célula ativa.
expressão.FindNext(After) Método FindNextexpressão necessária. Uma expressão que retorna um objeto Range. After Variant opcional. A célula depois da qual você deseja procurar. Corresponde à posição da célula ativa quando uma pesquisa é feita a partir da interface do usuário. Observe que After precisa ser uma única célula no intervalo. Lembre-se de que a pesquisa começa depois desta célula; a célula especificada não é pesquisada até que o método dê a volta e chegue à ela. Se esse argumento não for especificado, a pesquisa começará após a célula do canto superior esquerdo do intervalo. |
||||
| Show | Exibe um objeto UserForm.
Método Show Sintaxe [object.]Show modal A sintaxe do método Show tem as seguintes partes:
|




Imprimir




Muito boa as explicacoes deste site, tenho uma duvida, como fazer qdo o meu campo de pesquisa for data, eu tenho q mudar alguma coisa_>_? muito obrigado
Não é necessário alterações para buscar por data.
Estou perguntando por que eu fiz as mudancas e esta dando erro aqui._?:
Set Busca = Ficha.Cells.Find(What:=TermoPesquisado, After:=Range(“B43″), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
acho q na ultima linha, pelo menos e onde fica o ponteiro.
Não identifiquei erro acima.
Estou estudando esse material a bastante tempo, e neste momento estou usando ele para gerar um protocolo de serviço buscando dados em outro planilha.
O recurso que estou usando é esse:
‘Abra a unidade c: e o diretório SAEW
ChDir “C:\saew”
‘Abre o arquivo saetab.dbf e copia todos os dados
Workbooks.Open Filename:=”C:\saew\saetab.dbf”, Notify:=True
Cells.Select
Selection.Copy
Windows(“buca Personalizada.xls”).Activate
Sheets(“DADOS”).Select
Cells.Select
Range(“a1″).Activate
ActiveSheet.Paste
‘Fecha o arquivo SAETAB
Windows(“SAETAB.DBF”).Activate
ActiveWindow.Close
Formula de busca muito bem elaborada. Comigo esta funcionando tudo corretamente.
Muito obrigado Reinaldo, por compartilhar conosco as suas habilidades e conhecimento.
Nilton,
É um prazer.
Abçs
Caro amigo estou tentando utlizar este codigo de busca, porem se a consulta tiver que retornar valores em hora ? como faço?
Oi Wilson,
No caso do exemplo, as buscas são feitas com base em valores de cadeia de caracteres, ou seja, texto puro. O parâmetro de consulta é informado pela variável TermoPesquisado (As String).
Para adaptar a valores data/hora, você deverá informar ao programa, através de um identificador Date.
Sugestão: Crie um código condicional para fazer uma avaliação do tipo de parâmetro que foi recebido para consulta e alterar o tipo de variável a ser pesquisada.
Um abraço.
Amigo, sou leigo no VBA , pode ajudar com este codigo ?
Reinaldo o codigo e otimo… mais cinseramente não consegui criar a condicional explicada acima. ajuda por favor….
Estou utilizando a sua pesquisa e funciona perfeitamente quando usado a planilha 1, porem quando mudo para outra planilha nao funciona.
Meus dados estão na planilha 15, tentei colocar Plan15.Cells e NomePlanilha.Cells mas não funciona.
Um abraço
Victor,
Substitua todas as ocorrências de Plan1 para a Planilha desejada que dará certo sim.
Uma sugestão mais eficiente seria definir uma variável global de objeto e setá-la com a planilha desejada. E substituir todas as ocorrências de Plan1 no código por esta variável.
Abraço
Reinaldo segue a resolução ,Alterei o codigo na linha ;
TextBox3.Text =(Plan1.Cells(MatrizResultados(0), 3).Value
para :
TextBox3.Text = Format(Plan1.Cells(MatrizResultados(0), 3).Value, “hh:mm”)
Isto nas duas rotinas e está funcionado perfeitamente.
Obrigado pela ajuda e otimo Site… recomendo….
Esse código é mais que 100000000000000, me ajudou muito, acrescentei mais algumas funções e agora estou perdendo sono para configura-las;
Por favor se poder me ajudar, a função que acrescentei envia o formulário para o banco de dados até ai tudo bem, quando eu busco atraves da busca avançada e altero alguns dados deste cadastro não consigo fazer ele inserir na mesma linha de origem,ou seja, ele inseri na proxima linha vazia.
Olá Sampaio.
Fico feliz que este artigo tenha sido útil para você.
Quanto a sua pergunta, não sei qual o código que você adicionou para fazer inserções no banco. Mas, o que você necessita para que atenda o seu desejo de edição de dados, é que no momento da busca, seja coletada a informação de posição atual do registro localizado e exibido na tela.
Como disse, não sei qual o código que você usa para cadastramento no banco, mas pelo pouco que você falou, você só possui um código de inclusão de dados.
Abraço
Porque não me deu resposta e a minha pergunta foi retirada da postagem? qual foi o problema?
Sampaio, todos os comentários são moderados, para evitar spammers e propagandas indesejadas.
Assim que possÃvel sempre respondo aos comentários.
Sds
Olá Reinaldo;
Eu necessito que ao coletar a informação do banco de dados ela possa ser alterada e que esta alteração seja lançada de volta na mesma linha de origem, preservando assim o restante das informações que não precisaram ser alterados;
Se poder me ajudar, eu e meu sono agradece.
Abraço