Criando uma Pesquisa Personalizada Simples

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.
O arquivo utilizado neste artigo está disponivel para download. O link está lá no final do post.
Veja também a continuação deste artigo, onde ensino como pesquisar em mais de uma planilha e como editar os dados da planilha através do formulário.
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 Nothingse 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 Rangerepresentando 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:

object Opcional. Uma expressão de objeto que resulta em um objeto na lista Aplica-se a. Se object for omitido, o UserForm associado ao módulo UserForm ativo será assumido como object.
modal Opcional. Valor booleano que determina se o UserForm é em janela restrita ou sem janela restrita.

118 comentários em “Criando uma Pesquisa Personalizada Simples”

  1. 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)

    Responder
    • 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.

      Responder
  2. 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?

    Responder
  3. 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:\….

    Responder
  4. 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.

    Responder
    • 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.

      Responder
  5. 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?

    Responder
  6. Com Relação a este trecho do código comentado pelo Reinaldo, eu digitei e deu erro. Posteriormente Copiei e colei somente esta parte e funcionou.
    Set Busca=Plan1.Cells.Find(What:=TermoPesquisado,After:=Range(”A1″), LookIn:=xlFormulas,_
    LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=xlNext,_
    MatchCase:=False, SearchFormat:=False)
    Uma das coisas que Tive Duvida é após ajustar o Desing manda clicar em F7 e declarar duas variaveis, sendo que clicando em F7 a Tela já aparece para criar um UseForm. Fiquei indeciso se era para digitar ali mesmo ou não.
    O Que eu Gostaria agora é de acessar novamente o código do UserForm Para Fazer umas Modificações, mas não estou conseguindo.

    Responder
    • Haroldo,
      Como disse em resposta ao Reinaldo, se você tiver copiado no site e colado no código, alguns caracteres HTML podem não ser no mesmo padrão que um texto puro, exemplo disso são as “aspas duplas”, sempre dá erro nelas. Enfim, tente digitar o código manualmente.
      Quanto a sua dúvida da exibição do código, a tecla F7 é um tecla de atalho para acesso ao código do objeto que estiver ativo no momento do seu pressionamento. Alternativamente, você pode exibir o código do formulário, por exemplo, clicando em seu interior com o botão direito do mouse, em seguida, clicando na opção “Exibir código”. Outra maneira é acessar a opção “Exibir” no menu principal e selecionar a opção “Código”.
      Um abraço

      Responder
  7. meu caro amigo…
    esta dica de formulário acabou por resolver um grande problema meu… muito obrigado….
    estou doido para que vc poste uma nova busca para buscar mais de um termo…
    mas muito obrigado mesmo 😀

    Responder
  8. Boa tarde!Em primeiro lugar, parabéns pelo site!Muito bem explicado.Eu gstaria de saber se existe algum método de as cores da planilha não sairem na hora da impressão.Gostaria de as visualizar colorida na tela, mas na hora da impressão as cores não sairem.Desde já muito agradecido.

    Responder
    • Obrigado.
      Para imprimir em preto e branco, você pode clicar Arquivo > Configurar Página…
      Em seguida, selecione a aba “Planilha” e marque a opção “Preto e branco” do bloco Imprimir.
      Clique em Ok e pronto.
      Abraços

      Responder
  9. Olá
    Estava pensando em utilizar modelo semalhante em nossos controles aqui na empresa, porém antes das adaptações tentei exatamente o que descreve acima, e ao clikar no botão de comando, abre o formulário porém não funciona. também não dá mensagem de erro. apenas não funciona. favor enviar e-mail para contato, assim lhe mando meu arquivo para que vc possa verificar o que está errado.
    Abraços…

    Responder
    • Olá Edmar,
      Vários motivos podem causar a inoperância do código. Alguns deles eu já descrevi nos comentários deste artigo. Depois dê uma olhadinha neles, podem esclarecer sua dúvida.
      As macros podem estar desativadas: ative-as através das opções de segurança. Algum erro de digitação no código: tipo, caso vc tenha copiado e colado o código diretamente do site, as aspas não são compreendidas pelo compilador, tente substituí-las. Enfim, existem n possibilidades.
      Mas se quiser, enviar uma planilha para nós, acesse o link Orçamento gratuito. Inclusive, aproveito para dizer que desenvolvemos projetos de acordo com a proposta do cliente, automatizando aos mais diversos tipos e modelos de planilhas com ótimos preços. E o orçamento, como disse, é gratuito.
      Abraço.

      Responder
  10. DIZ TUDO CONFORME ORIENTADO MAS DA ERRO SpinButton1 E MANDA DEPURAR
    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

    Responder
  11. Olá,
    Cara está dica é D+ 100%, queria saber só um pouquinho do que vc sabe.
    Estou vendo as outras dicas e são TOP.
    Não consegui escrever o vba mas vi que vc postou acima, e funciona 100%,
    até localizei onde eu estava errando.
    Attenciosamente
    GGB

    Responder
  12. 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.

    Responder
  13. 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

    Responder
  14. Formula de busca muito bem elaborada. Comigo esta funcionando tudo corretamente.
    Muito obrigado Reinaldo, por compartilhar conosco as suas habilidades e conhecimento.

    Responder
    • 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.

      Responder
  15. 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

    Responder
    • 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

      Responder
  16. 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….

    Responder
  17. 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.

    Responder
    • 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

      Responder
  18. 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

    Responder
  19. Boa tarde, Reinaldo
    Espero que possa me ajudar, desde já obrigado;
    Coloquei este codigo na sua “Pesquisa Personalizada”, a idéia é que quando ele buscar os dados o mesmo possa ser alterado, ex. mudar somente o telefone ou endereço etc. e o restante permaneça, porém esses dados precisam ser lançados de volta na mesma linha de origem da planilha já com as alterações;
    Só consegui fazer o codigo lançar em uma nova linha vazia abaixo, preciso muito que ele volte na linha de origem, existem varias planilhas buscando esses dados.
    Private Sub CommandButton1_Click()
    ‘Insere as informações no banco de dados
    ‘Seleciona a primeira linha vazia da coluna “A”
    Range(“A” & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0).Select
    ‘Insere as informações na coluna correspondente
    ‘onde 0 corresponde “A”, 1 corresponde “B” e assim por diante
    ActiveCell.Offset(0, 0).Value = TextBox1.Text
    ActiveCell.Offset(0, 1).Value = TextBox2.Text
    ActiveCell.Offset(0, 2).Value = TextBox3.Text
    ActiveCell.Offset(0, 3).Value = TextBox4.Text
    ‘limpa os textbox
    TextBox1 = Empty
    TextBox2 = Empty
    TextBox3 = Empty
    TextBox4 = Empty
    ‘retorna o cursor no textbox_1
    TextBox1.SetFocus
    End Sub

    Responder
    • Sampaio,
      Para que você possa editar os dados exibidos na tela de busca, sugiro que você modifique o seu código assim:
      Private Sub CommandButton1_Click()
      ‘———– Atualiza as informações no banco de dados ————
      Dim Linha As Long
      Linha = MatrizResultados(SpinButton1.Value)
      ‘Insere as informações na coluna correspondente
      ‘onde 1 corresponde “A”, 2 corresponde “B” e assim por diante
      Plan1.Cells(Linha, 1).Value = TextBox1.Text
      Plan1.Cells(Linha, 2).Value = TextBox2.Text
      Plan1.Cells(Linha, 3).Value = TextBox3.Text
      Plan1.Cells(Linha, 4).Value = TextBox4.Text
      ‘limpa os textbox
      TextBox1 = Empty
      TextBox2 = Empty
      TextBox3 = Empty
      TextBox4 = Empty
      ‘retorna o cursor no textbox_1
      TextBox1.SetFocus
      End Sub
      Isto é apenas uma adaptação ao teu código, ok.
      Abraço

      Responder
  20. Boa tarde, Reinaldo
    Obrigado pelo retorno, e pela força, mas ja consegui resolver com esse código abaixo, ficou demais, nunca vi na Net nada tão bom quanto esse teu projeto.
    Att. Sampaio
    Private Sub CommandButton1_Click()
    ‘ NOVO CODIGO
    ‘Atualiza os dados na planilha
    ActiveCell.Offset(0, 1).Value = Me.TextBox1
    ActiveCell.Offset(0, 2).Value = Me.TextBox2
    ActiveCell.Offset(0, 3).Value = Me.TextBox3
    ActiveCell.Offset(0, 4).Value = Me.TextBox4
    ‘limpa os textbox
    txt_Procurar = Empty
    TextBox1 = Empty
    TextBox2 = Empty
    TextBox3 = Empty
    TextBox4 = Empty
    ‘retorna o cursor no txt_procurar
    txt_Procurar.SetFocus
    End Sub

    Responder
    • Obrigado pela força ao meu trabalho.
      Quanto ao teu código, que bom que deu certo, mas tome um certo cuidado, pois ele está baseado na célula ativa (ActiveCell), ou seja, se por acaso você clicar por engano, ou mover-se para outra célula, a célula ativa deixará de ser referente a tua pesquisa. Já no código que te passei, a referência não se quebrará até a execução de uma nova consulta, ok!!
      Abraço.

      Responder
  21. Alias, Reinaldo, como faço para abrir o formulario e acionar automaticamente um botão comando btn_novo segue o código abaixo:
    A idéia é quando abrir o formulário ele rode esta macro automaticamente e deixe o formulario pronto para receber novo cadastro e assim evitar cadastro em local indesejado;
    Private Sub btn_novo_Click()
    ‘envia para a textbox e procura
    txt_Procurar = (“Novo Cadastro”)
    If Me.txt_Procurar.Text = “” Then
    MsgBox “Digite um valor para a pesquisa”
    Else
    Call ProcuraPersonalizada(Me.txt_Procurar.Text)
    End If
    ‘retorna o cursor no txt_procurar
    TextBox1.SetFocus
    End Sub
    Abçs
    Sampaio

    Responder
  22. Olá Reinaldo, em primeiro lugar este modelo eu venho procurando há 1 ano e meio.
    Meus parabéns, me ajudou muito.
    O problema é quando eu peço para procurar os dados em uma única coluna, coloquei o comando que você mencionou acima mas dá erro de sintaxe. Veja:
    ‘Executa a busca
    Set Busca = Plan2.Range(“B:B”).Find(What:=TermoPesquisado, After:=Range(“A1”), LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)
    No meu caso estou pedindo para buscar na planinha 2, até ai tudo bem, mas ando peço para buscar na coluna B que é onde estão os nomes (desejo filtrar apenas isso) dá este erro.
    Estou fazendo errado?
    Grato

    Responder
  23. estou usando o teu modelo só que tenho dados em duas planilhas na plan2 e na plan3 e gostaria de poder usar a opçao procurar mas nas duas planilhas ao mesmo tempo pois elas têm a mesma estrutura o que que pretendo procurar esta na mesma coluna. ADOREI o teu modelo é o melhor que já vi.
    Obrigado por o teres disponibilizado

    Responder
  24. mais uma pergunta o que significa;
    No modulo1 da pesquisa personalizada2 diz:
    Sub teste()
    Dim sword As String
    Do While Len(sword) < 25000
    sword = sword & "A"
    Loop
    MsgBox Len(sword)
    End Sub
    concretamente o que significa?
    Agradecia muito uma explicação pois não sei para que serve. Cumprimentos

    Responder
    • Polux,
      Foi esquecimento meu no código… era um estudo a parte que eu estava fazendo… nada tem a ver com este artigo.
      Perdoe-me, mas já foi removido do arquivo para download.
      Abraço e obrigado pelo alerta!!!

      Responder
  25. Tao simples e de facil didatica , tentar programar no vb pareceia impossivel,depois de ler alguns artigos teus acreditei que poderia aprender e realmente aprendi…parabens pela forma simples de ensinar …muito obrigado por me fazer ver que posso aprender. excelente materia e tutorial.

    Responder
  26. Reinaldo, no caso fiz algumas alterações na planilha do excel e coloquei mais algumas informações que eu precisaria… no caso tenho um controle de férias que mostra a data de cada saida de colaborador… oque eu gostaria de saber se e possível colocar um calendario ao lado mostrando a data que o mesmo saiu até a data que ele volta!!! E possível?!
    Abcs…

    Responder
  27. Ola, comigo apareceu o erro 424, quando verifiquei, notei que :
    frm.Show False ‘Exibe o Formulário da Pesquisa
    esta em amarelo, o que devo fazer, já verifiquei letra por letra a digitação e não encontrei nada de errado, preciso de uma solução o mais rapido possível, obrigado.

    Responder
  28. Boa tarde
    O código realmente é muito bem detalhado, parabéns, porém redigitei e analise e fica dando o erro 424, indicando a falta de objeto obrigatório. Alguém mais comentou sobre isso ?
    Desde já grato,
    Abraço

    Responder
  29. Opa, achei o erro, era num label mal formatado. Porém agora deu um erro de tipos incompatíveis 13, na procura personalizada, quando indica que o textbox irá carregar os dados da matrizresultados(0),1……alguém comentou sobre isso ? possui alguma idéia do que se trata ?

    Responder
  30. Olá, boa tarde!!
    Muito bom esse artigo…
    estou com um problema…
    estou tentando programar uma pesquisa que contém 20 campos…
    porém, está dando erro na parte onde ‘executa a busca’
    Quando mando pesquisar, aparece a mensagem:
    Erro em tempo de execução ‘424’:
    o objeto é obrigatório
    abaixo segue minha linha de comando…
    a propósito: baixei o arquivo .doc e o programa em si, e verifiquei que no programa, na primeira linha da set, o After:=range(“A1”) não aparece o nome da planilha, já no .doc aparece o nome da planilha… o programa funciona normalmente sem a definição da planilha, mas já tentei dos dois jeitos e não consegui. Pode me ajudar:
    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 = alunos.Cells.Find(What:=TermoPesquisado, After:=alunos.Range(“A1”), LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

    Responder
  31. Oi, excelente este artigo…
    só fiquei com uma dúvida
    minha linda de comando que faz a procura está dando erro:
    erro em tempo de execução ‘424’:
    o objeto é obrigatório
    eu simplesmente alterei o nome da planilha, tirei Plan1 e coloquei alunos, que é o nome da minha planilha. O fato de ter mais campos de procura pode afetar essa linha de comando?

    Responder
  32. em vez de Sheets(“aluno”) não seria Sheets(“alunos”)???
    Ficaria assim??
    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 = Sheets(“alunos”).Cells.Find(What:=TermoPesquisado, After:=Sheets(“alunos”).Range(“A1″), LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

    Responder
  33. Uma dica para colar a tabela no excel: colar especial, texto unicode.
    Ainda não li o código e os “Termos Aprendidos”, mas o tutorial me parece muito bom. Colei tudo direitinho no vba, mas nada está sendo localizado. Mais tarde tento novamente, mas onde pode estar o erro?

    Responder
      • Cara, há outras dicas como essa caixa “termos aprendidos”? Onde é possível encontrarmos explicações tão boas sobre os comandos VBA como encontramos ali?

        Responder
      • Tenho duas novas dúvida:
        1. O que acontece se tivermos células mescladas envolvidas? Quero dizer, se, por exemplo, o nome ocupar três células mescladas (exemplo, A1 a A3) e as propriedades (Estado, Função, Status) ocuparem, respectivamente, B1, B2 e B3?
        2. Em “.Cells(MatrizResultados(0), 1).Value”, o que significa cada argumento de Cells()? Isto é, porque utilizamos sempre o índice zero da matriz e os índices de 1 a 4 na coluna?
        Muito Obrigado.

        Responder
          • Esse código de pesquisa é baseado na estrutura do comando Localizar do Excel, portanto, a célula mesclada retorna apenas (1) um indicativo de resultado. Neste modelo de planilha, não seria eficaz.

        • Os indicadores das linhas onde foram encontrados os termos pesquisados ficam armazenadas no vetor MatrizResultados, portanto o índice 0 (zero) corresponde ao primeira linha que atende a pesquisa, e caso haja mais resultados, ficam armazenados nos índices seguintes, MatrizResultados(1), MatrizResultados(2), …, e assim por diante.

          Responder
    • Wilson,
      Exemplo:
      Sub Relatorio()
      Dim sLinha As Long
      Dim iPlanilha As Integer
      Dim TotalOcorrencias As Long
      Dim wsPlanRelatorio As Worksheet
      If IsArray(MatrizResultadosLinha) Then
      Set wsPlanRelatorio = Sheets(“Plan3”) ‘Coloque aqui o nome da planilha modelo do relatório
      iLinhaInicialRel = 1
      TotalOcorrencias = SpinButton1.Max
      ‘Configura o cabeçalho
      With wsPlanRelatorio
      .Cells(iLinhaInicialRel, 1) = “Localização”
      .Cells(iLinhaInicialRel, 2) = “Nome”
      .Cells(iLinhaInicialRel, 3) = “Estado”
      .Cells(iLinhaInicialRel, 4) = “Função”
      .Cells(iLinhaInicialRel, 5) = “Status”
      End With
      iLinhaInicialRel = iLinhaInicialRel + 1
      ‘Escreve os resultados no relatório
      For i = 0 To TotalOcorrencias
      sLinha = MatrizResultadosLinha(i)
      iPlanilha = MatrizResultadosPlanilha(i)
      With Sheets(iPlanilha)
      wsPlanRelatorio.Cells(iLinhaInicialRel, 1) = “Em ” & .Name
      wsPlanRelatorio.Cells(iLinhaInicialRel, 2) = .Cells(sLinha, 1).Value
      wsPlanRelatorio.Cells(iLinhaInicialRel, 3) = .Cells(sLinha, 2).Value
      wsPlanRelatorio.Cells(iLinhaInicialRel, 4) = .Cells(sLinha, 3).Value
      wsPlanRelatorio.Cells(iLinhaInicialRel, 5) = .Cells(sLinha, 4).Value
      End With
      iLinhaInicialRel = iLinhaInicialRel + 1
      Next i
      MsgBox “Relatório emitido.”
      End If
      End Sub
      É só modificar para a tua necessidade.
      Abç

      Responder
  34. REINALDO, QUERIA VER SE VOCE PODE ME AJUDAR…
    BAIXEI O ARQUIVO E COPIEI A “FRMBUSCA” PRA MINHA PLANILHA.
    DUVIDA 1: QUERO BUSCAR NAS COLUNAS A,B,C,D NA PLANILHA “CATALOGO”, COMO QUE FACO?
    DUVIDA 2: ESTA DANDO O SEGUINTE ERRO, PODE ME JUDAR?
    OBS: ALTEREI TODAS AS “PLAN1” PARA “CATALOGO”.
    SEGUE O CODIGO ABAIXO:
    Public MatrizResultados As Variant
    Public Total_Ocorrencias As Long
    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 = CATÁLOGO.Cells(Linha, 1).Value
    TextBox2.Text = CATÁLOGO.Cells(Linha, 2).Value
    TextBox3.Text = CATÁLOGO.Cells(Linha, 3).Value
    TextBox4.Text = CATÁLOGO.Cells(Linha, 4).Value
    End Sub
    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 = CATÁLOGO.Cells.Find(What:=TermoPesquisado, After:=Range(“A:A”), 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 = CATÁLOGO.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 = CATÁLOGO.Cells(MatrizResultados(0), 1).Value
    TextBox2.Text = CATÁLOGO.Cells(MatrizResultados(0), 2).Value
    TextBox3.Text = CATÁLOGO.Cells(MatrizResultados(0), 3).Value
    TextBox4.Text = CATÁLOGO.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
    Private Sub UserForm_Initialize()
    SpinButton1.Enabled = False
    Label_Registros_Contador.Caption = “”
    End Sub
    AGRADECO SUA AJUDA. OBRIGADO!

    Responder
    • NA DUVIDA 2 O ERRO E O SEGUINTE:
      Set BUSCA = CATÁLOGO.Cells.Find(What:=TermoPesquisado, After:=Range(“A:A”), LookIn:=xlFormulas, _
      LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
      MatchCase:=False, SearchFormat:=False)
      OBRIGADO.

      Responder
      • Ricardo, quando você quiser referenciar uma planilha pelo seu Nome (aquele que aparece na aba), você tem que fazer assim:
        Sheets(“Catálogo”)
        Acredito que fazendo esta correção sua macro já vai rodar perfeitamente,
        Abç

        Responder
        • Reinaldo, obrigado pelo retorno!
          fiz a alteracao, mas continuo com o seguinte erro:
          Set BUSCA = Sheets(“Catálogo”).Find(What:=TermoPesquisado, After:=Range(“A:A”), LookIn:=xlFormulas, _
          LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
          MatchCase:=False, SearchFormat:=False)
          pode me ajudar?
          obrigado.
          Ricardo

          Responder
          • Não sei qual o erro está dando.
            Sugiro que corrija todas as aspas duplas (“) do código.
            Pode ser que você tenha colado direto do site e o VBA não interpretou corretamente as aspas.
            Abç

  35. Simplesmente não funcionou.
    Private Sub fica em amarelo;
    SearchFormat:= Fica sublinhada essa parte do código.
    Obrigado e parabéns pelo site.
    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:=Range(“A1”), LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

    Responder
  36. Em algumas buscas pela internet achei esse código maravilho e bem interessante. só me resta uma duvida como posso fazer para o resultado dessa pesquisa aparecer num listview

    Responder
  37. Meus Caros;
    Sou bastante leigo noaasunto e utilizei sua planilha para criação de outra, porém precisava que em algumas textbox me mostrassem os valores monetários e outros com casas decimais será que você poderia me ajudar.
    Atenciosamente.
    Edson Ricardo

    Responder
    • Edson,
      Para formatar estes valores você precisa usar a função FORMAT quando for carregar os valores do Textbox.
      Exemplo para exibir valores com duas casas decimais:
      Textbox1.Text = Format(29450.17, “#,##0.00”)
      Exemplo para exibir valores em reais (R$):
      Textbox1.Text = Format(29450.17, “R$ #,##0.00”)
      Abç

      Responder
      • Caro Reinaldo;
        Muito obrigado pelos seus esclarecimentos porém acho que ainda me resta uma dúvida realmente o número fica formatado neste formato porém necessito que seja formatado o numero que será pesquisado neste caso apresentado por você aparece o número 29450.17, que foi o intrudizido no VBA eu necessito na verdade que seja mostrado o número encontrado na tabela neste formato.
        Caso possa me ajudar agradeço.
        Atenciosamente.
        Edson Lima.

        Responder
        • Edson,
          Se você estiver utilizando a mesma estrutura do exemplo deste artigo, pode fazer assim então:
          TextBox1.Text = Format(Plan1.Cells(MatrizResultados(0), 1).Value, “#,##0.00″)
          A parte destacada em negrito significa onde deve ser informado o dado que será formato. Você pode perceber isso comparando com o comentário que fiz anteriormente (onde coloquei um valor fixo)
          Um abraço

          Responder
          • Prezado Reinaldo;
            Muitissímo obrigado pela ajuda agora realmente foi extamente o que eu queria,
            Obrigado pela força;
            Um grande abraço;
            Edson Lima

  38. Reinaldo,
    Acho que você pode me ajudar, está dando o seguinte erro:
    Set Busca = Plan1.Cells.Find(What:=TermoPesquisado, After:=Plan1.Range (“A1”), LookIn:=xlFormulas,
    Minha planilha está renomeada como Plan1

    Responder
  39. Reinaldo,
    Na minha planilha tem linhas onde há o mesmo valor
    por exemplo
    A B C D
    1 E A 1
    Vamos supor que seja assim
    Ai no contador de registro ele conta como dois resultados essa linha…
    Desde ja agradeço

    Responder
  40. Por favor vcs poderiam me ajudar, tenho esta configuração de pesquisa, o problema é que ela só busca valor igual (o conteúdo identico) e não as iniciais como uma pesquisa deve ser, agraço a atenção. Segue abaixo o meu exemplo:
    Private Sub CommandButton1_Click()
    ‘PROCURA O NOME DIGITADO NO CAMPO PESQUISA
    With Plan1.Range(“A:A”)
    Set c = .Find(TextBox1.Value, LookIn:=xlValues, LOOKAT:=xlWhole)
    If Not c Is Nothing Then
    c.Activate
    UserForm1.TextBox1.Value = c
    UserForm1.TextBox2.Value = c.Offset(0, 1).Value
    UserForm1.TextBox3.Value = c.Offset(0, 2).Value
    UserForm1.TextBox4.Value = c.Offset(0, 3).Value
    UserForm2.Hide
    End If
    ‘LIMPA OS CAMPOS DO FORMULÁRIO
    TextBox1.Value = Empty
    If c Is Nothing Then
    MsgBox “Nome não encontrado!!!””
    End If
    End With
    End Sub

    Responder
  41. Prezado, boa tarde!
    Primeiramente, parabéns pelo site, tenho aprendido muito aqui.
    Adaptei seu código porém na hora de executar está me dando o seguinte erro: Erro em tempo de execução 424. O objeto é obrigatório.
    Após isso marca no VB o seguinte trecho:
    Set Busca = Base.Cells.Find(What:=TermoPesquisado, After:=Range(“A1”), LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)
    Sou leigo no VB, poderia me ajudar? Segue o código completo que eu adaptei:
    [Editado]

    Responder

Deixe uma resposta para Lukas Cancelar resposta