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 obrigado, amigo. Você me tirou muitas dúvidas com esse artigo!
Esta expressão abaixo só fica no vermelho, ja conferi..reconferi…e não encontrei onde esta o erro…se ela não pretejar..rssss não funciona…ONDE FOI QUE EU ERREI ???
Set Busca=Plan1.Cells.Find(What:=TermoPesquisado,After:=Range(“A1″), LookIn:=xlFormulas,_
LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=xlNext,_
MatchCase:=False, SearchFormat:=False)
Reinaldo, acredito que você tenha copiado o código neste artigo e colado no excel. Alguns caracteres quando são copiados do html tem uma codificação que não é interpretada corretamente no ambiente VBA, inclusive.
Faça o seguinte, neste seu caso especÃfico, redigite as “aspas duplas” no código. Então vai dar certo.
Obrigado pela visita.
Qdo eu mando executar ele chega a abrir a caixa de pesquisa, mas quando vou pesquisar ele gera o erro 424 dizendo q o objeto eh obrigatório, como eu conseguiria contornar esse erro?
Davidson, seu provável erro deve ser na digitação do código. Após o erro, o análise de erros do VB deve marcar em amarelo a linha com problema. Veja o que está escrito e poste aqui novamente. Abraço.
Private Sub CommandButton1_Click()
frmBusca.Show False
End Sub
A linha fica no frmBusca.show
Você tem alguma apostila sobre VBA, eu tentei redigitar os códigos, mas não foi. Mesmo assim vlw pela ajuda ab!
Boa tarde!
Você sabe dizer se no excel há alguma maneira de verifiar a a existencia de algum caminho por exemplo. Eu gostaria de fazer um If com a seguinte sentença
If o endereço abaixo exista, execute-o
Windows(“Processo de devolução de leasing.xls”).Activate
Else
execute esse caminho alternativo
c:\….
Este site me foi muito util, parabens ao seu idealizador,
grato!
wenes
Obrigado pelas palavras. Incentivam muito o nosso trabalho.
Testei a rotina e funcionou perfeitamente, inclusive com acréscimo de novos campos de pesquisa. Ficou uma dúvida: caso queira pesquisar numa única coluna, como fazer? Se não estou enganado, o FIND pesquisa na planilha toda.
Você pode pesquisar em colunas especÃficas sim. No exemplo, ensinei a pesquisar na planilha inteira. Eu usei Plan1.Cells. Para pesquisar em uma coluna só, você deve definir a coluna desejada na expressão do método find. Exemplo: Para pesquisar na coluna A, digite: Plan1.Range(“A:A”).Find. Entendeu?! Assim a pesquisa será feita apenas na coluna A.
Um abraço.
As informações deste site são as mais úteis e diretas que já encontrei. Grato pelo pronto retorno.
Tenho feito muito bom uso desta pesquisa. Como sempre, as necessidades avançam: que modificações devo introduzir para que a pesquisa colete dados de outra pasta de trabalho diferente daquela onde está o form? É possÃvel?
É possivel sim. Basta informar a região onde será feita a pesquisa. No exemplo, eu referencio a Plan1. Você pode alterar para a planila que desejar.
Abraço.