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. |
||||
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:
|
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?
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.
O espinButton não funciona, fica ativado porem não segue para frente nem para trás o que está errado?
Sem ver o seu arquivo fica difícil saber o que deu errado. Pode ser alguma falha de digitação. Uma simples aspas inserida de forma incorreta já impossibilita a boa eficácia do código.
È bom porém o spinButton não funcionou, ele fica ativado mas não vai para frente nem para trás, o que deve estar errado!
Nilson
Respondido no tópico anterior
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.
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
Conforme o Nilson Disse, Realmente o SpinButton não funcionou comigo também.
Haroldo,
Fica difícil prever o que possa estar ocorrendo no seu projeto sem ter acesso a sua planilha.
Sugestão: Baixe o arquivo fonte que disponibilizei aqui no site e faça os testes.
Baixar Arquivo de Exemplo
Um abraço.
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 😀
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.
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
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…
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.
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
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
Aqui Portugal
Gostei muito deste site. É EXCEL mesmo do meu jeito. Obrigado
Cesar
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
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
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
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
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.
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
Sampaio,
Chame a rotina deste botão de comando no Evento de inicialização do formulário, ok.
Private Sub UserForm_Initialize()
Call btn_novo_Click
End Sub
Obrigado Reinaldo, deu tudo certo, valeu pela dica
Abraços Sampaio
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
Tente modificar também a parte da instrução que diz After:=Range(“A1”) por:
After:=Plan2.Range(“B1”)
Espero ajudar,
abçs
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
Olá. Fico agradecido pelo comentário.
Quanto a teu pedido, aproveitei e postei um artigo explicando que soluciona o teu problema.
https://www.exceldoseujeito.com.br/2010/05/28/pesquisa-personalizada-simples-2-a-missao/
Abraço
obrigada amigo era mesmo o que eu precisava. Cumprimentos
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
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!!!
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.
Valeu Jose,
Seu comentário é muito edificante.
Muito obrigado.
Abraço e bons estudos…
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…
Não existe um controle específico para isso não.
Abç
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.
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
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 ?
Nossa, amei essa página
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)
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?
Tente substituir:
alunos
por
Sheets(“aluno”)
Abç
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)
Amigo, consegui utilizando Sheets(“alunos”), muito obrigado pela dica!!!
Show de bola esse artigo, me ajudou um monte…
Abraços
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?
acho que já encontrei; no meu caso, é Plan2
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?
O texto da seção “Termos Aprendidos” foi extraído da documentação de ajuda do Excel.
Abç
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.
Quanto aos índices de coluna, 1 se refere a NOME, 2 a estado, etc. Então não é possível resolver a questão de células mescladas por esse código?
Então como fazer um código de uma busca em uma tabela do tipo: http://lc4.in/H7Os?
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.
Muito Obrigado, Reinaldo Coral.
Reinaldo , duvidas e mais duvidas , se eu quiser gerar um relatorio apartir desta busca no caso Datas como faço ?
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ç
Cara legal seu site, gostei muito.
Teria como fazer os resultados vir como um datagrid ou algio assim.
sds
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!
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.
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ç
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
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ç
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)
Paulo,
Você baixou o arquivo de exemplo.
Teste a partir dele. Pode ser que você tenha copiado e colado o código do site, e com isso, a formatação dos códigos HTML esteja dando conflito…
Abç
Prezado Reinaldo:
Eu baixei o arquivo exemplo, e é justamente ele
que está dando a ocorrência relatada acima.
Obrigado.
Sem querer abusar da sua boa vontade; será que
existe alguma maneira do excel avisar antes de
eu deletar o conteúdo de uma célula. Tipo pedir
uma confirmação.
Obrigado mais uma vez. Paulo.
Paulo, verifiquei novamente o arquivo e não consegui reproduzir o erro relatado.
Quanto a questão do pedido de confirmação antes de excluir, não existe não.
Abç
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
Olá Ronilson,
Respondido aqui:
https://www.exceldoseujeito.com.br/2012/08/24/excel-perguntas-e-respostas-1/
Abç
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
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ç
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.
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
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
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
Olá Leandro,
Você testou a planilha de exemplo disponível para download?
Abç
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
Oi Lukas,
Não entendi sua dúvida.
Envia sua dúvida pelo link abaixo, explicando melhor o que você quer alcançar:
https://www.exceldoseujeito.com.br/servicos/tire-sua-duvida/
Abç
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
Olá Michel,
Troque:
Por:
Abraço
Olá Reinaldo;
Muito obrigado, funcionou perfeitamente;
Valeu;
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]
Favor desconsiderar… Já consegui, de uma hora para outra, simplesmente funcionou. Hehehehhe
Sem problemas.
Um abraço.