none
pesquisar valor de células RRS feed

  • Pergunta

  • Ai pessoal, tenho o código abaixo que faz o procura por um valor, o problema é que ele só localiza uma vez, ou seja, se eu tiver um cadastro com duas pessoas do mesmo nome (MARIA), ele só pega o primeiro, o que eu preciso é que ele faça a primeira consulta e me traga o valor e depois faça uma nova consulta para localizar o próximo valor.

     

    Private Sub CommandButton1_Click()

    Dim Planilha

    Dim firstAddress

    Dim Address

    Dim Pesquisa

    Dim Texto

    Dim k

    Dim ValorPesquisado

    Dim ValorColB, ValorColC, ValorColD

     

    Unload Me

    ValorPesquisado = TextBox1.Value

    If ValorPesquisado = "" Then Exit Sub

    For Each Planilha In ThisWorkbook.Sheets

    With Planilha.Cells

        Set Pesquisa = .Find(ValorPesquisado, LookIn:=xlValues)

        If Not Pesquisa Is Nothing Then

            firstAddress = Pesquisa.Address

            k = 0

            Do While firstAddress <> Address

                Address = Pesquisa.Address

                ValorColB = Planilha.Range(Address).Offset(rowOffset:=0, columnOffset:=1)

                ValorColC = Planilha.Range(Address).Offset(rowOffset:=0, columnOffset:=2)

                ValorColD = Planilha.Range(Address).Offset(rowOffset:=0, columnOffset:=3)

                Texto = Texto & vbLf & vbLf & "ENDEREÇO: " & ValorColB

                Texto = Texto & vbLf & vbLf & "TELEFONE: " & ValorColC

                Texto = Texto & vbLf & vbLf & "E-MAIL: " & ValorColD

                Exit For

               

            Loop

        End If

    End With

    Next Planilha

    If IsEmpty(Texto) Then

    MsgBox "Não foi possível localizar a matrícula." & vbLf & "Verifique o valor digitado e refaça a sua busca."

    Else

    MsgBox "NOME : " & ValorPesquisado & vbLf & Texto

    End If

     

    A planilha tá no endereço http://www.megaupload.com/?d=10G9P82L mas se possível, eu quero saber quais as alterações feitas para eu não me bater em uma outra ocasião.

     

    Grato,

    terça-feira, 17 de maio de 2011 05:11

Respostas

  • Rsant boa tarde,

    O problema que identifiquei foi erro de lógica:

    A mensagem de código não identificado estava no local errado, a mensagem deve ficar fora do FOR e você tinha colocado dentro.

    Dei uma organizada no seu código.

    Dica: Procure sempre tipar suas variáveis. Isso ajuda a previnir problemas.

    Segue o algoritmo:

    Private Sub CommandButton1_Click()

    Dim count As Integer
    Dim count2 As Integer
    Dim value As String
    Dim achou As Boolean

        Unload Me
        count2 = 1

        'Neste momento estamos atribuindo o valor false a variável booleana
        achou = False

            'Enquanto o contador for menor que 20000 *que é o número de linhas pesquisadas* o DO WHILE não para
            Do While count < 20000
           
            'Atribuindo o primeiro valor encontrado a variável value
            value = Plan3.Range("A" & count2)

                If value = TextBox1.value Then
                'Se encontrar 1 valor que seja alteramos a variável booleana para true
                achou = True
                'Exibe o resultado encontrado
                MsgBox "NOME : " & Plan3.Range("B" & count2) & vbLf & Plan3.Range("C" & count2) & vbLf & Plan3.Range("D" & count2)
       
                End If
       
                count2 = count2 + 1
       
                If (VBA.IsEmpty(Plan3.Range("A" & count2))) Then
                'Se não encontrar nada atribui o valor false a variável booleana e exibe a msg de não encontrado
                    If achou = False Then
                        MsgBox "Não foi possível localizar a matrícula." & vbLf & "Verifique o valor digitado e refaça a sua busca."
                    End If
                    Exit Do
                End If
            Loop
    End Sub


    Carlos Carvalho Citrangulo Junior
    Microsoft Certified Professional
    Microsoft Certified Desktop Support Technician
    MCTS Microsoft Windows Vista Configuration
    MCITP Enterprise Support Technician
    Profissional 5 Estrelas Microsoft
    http://carloscitrangulo.wordpress.com
    • Sugerido como Resposta Carlos C Citrangulo Jr terça-feira, 17 de maio de 2011 16:41
    • Marcado como Resposta rsant quarta-feira, 18 de maio de 2011 14:18
    terça-feira, 17 de maio de 2011 16:41
  • Opa bom dia!

    Vamos sim,

    Segue o algoritmo aperfeiçoado. As alterações estão em negrito.

    Private Sub CommandButton1_Click()

    Dim count As Integer
    Dim count2 As Integer
    Dim value As String
    Dim achou As Boolean


        Unload Me
        count2 = 1
        achou = False

            Do While count < 20000
            value = Plan3.Range("A" & count2)
                'VBA.InStr faz a função do * e a função Ucase transforma tudo para maiúsculo em segundo plano
                If VBA.InStr(VBA.UCase(value), VBA.UCase(TextBox1.value)) = 1 Then
                achou = True
                MsgBox "NOME : " & Plan3.Range("B" & count2) & vbLf & Plan3.Range("C" & count2) & vbLf & Plan3.Range("D" & count2)
       
                End If
       
                count2 = count2 + 1
       
                If (VBA.IsEmpty(Plan3.Range("A" & count2))) Then
               
                    If achou = False Then
                        MsgBox "Não foi possível localizar a matrícula." & vbLf & "Verifique o valor digitado e refaça a sua busca."
                    End If
                    Exit Do
                End If
            Loop
    End Sub

     

    Está feito e funcionando. Espero ter ajudado.

    Rsant como foi duas perguntas diferentes respondidas por favor marcar as duas como resposta.


    Carlos Carvalho Citrangulo Junior
    Microsoft Certified Professional
    Microsoft Certified Desktop Support Technician
    MCTS Microsoft Windows Vista Configuration
    MCITP Enterprise Support Technician
    Profissional 5 Estrelas Microsoft
    http://carloscitrangulo.wordpress.com
    • Sugerido como Resposta Carlos C Citrangulo Jr quarta-feira, 18 de maio de 2011 13:01
    • Marcado como Resposta rsant quarta-feira, 18 de maio de 2011 14:19
    quarta-feira, 18 de maio de 2011 13:01
  • Olá rsant boa tarde,

    Não tem problema não, vamos a solução.

    As alterações estão em negrito.

    Private Sub CommandButton1_Click()

    Dim count As Integer
    Dim count2 As Integer
    Dim value As String
    Dim achou As Boolean


        Unload Me
        count2 = 1
        achou = False

            Do While count < 20000
            value = Plan3.Range("A" & count2)
           
                If VBA.InStr(VBA.UCase(value + "*"), VBA.UCase(Trim(TextBox1.value))) >= 1 Then
                achou = True
                If MsgBox("Finalizar pesquisa?" & vbLf & vbLf & "NOME : " & Plan3.Range("B" & count2) & vbLf & Plan3.Range("C" & count2) & vbLf & Plan3.Range("D" & count2), vbYesNo) = vbYes Then
                Exit Sub
                Else
                End If
                End If
               
                count2 = count2 + 1
       
                If (VBA.IsEmpty(Plan3.Range("A" & count2))) Then
               
                    If achou = False Then
                        MsgBox "Não foi possível localizar a matrícula." & vbLf & "Verifique o valor digitado e refaça a sua busca."
                    End If
                    Exit Do
                   
                End If
            Loop
    End Sub

     

    Legal você querer estudar, é isso aí mesmo, buscar conhecimento.

    Em meu blog a sessão de VBA iniciou semana passada, vou postar assunto de VBA pelo menos 2 vezes por semana, inclusive hoje vou blogar lá.

    Mas vou te passar mais um link bom de estudo com aula a aula (ingles) de VBA: http://www.excel-vba.com/excel-vba-contents.htm


    Rsant como foi três perguntas diferentes respondidas, por favor, marcar as três como resposta.

    Abraços,

     


    Carlos Carvalho Citrangulo Junior
    Microsoft Certified Professional
    Microsoft Certified Desktop Support Technician
    MCTS Microsoft Windows Vista Configuration
    MCITP Enterprise Support Technician
    Profissional 5 Estrelas Microsoft
    http://carloscitrangulo.wordpress.com
    • Sugerido como Resposta Carlos C Citrangulo Jr quinta-feira, 19 de maio de 2011 16:14
    • Marcado como Resposta rsant sexta-feira, 20 de maio de 2011 07:06
    quinta-feira, 19 de maio de 2011 16:14

Todas as Respostas

  • Rsant boa tarde,

    O problema que identifiquei foi erro de lógica:

    A mensagem de código não identificado estava no local errado, a mensagem deve ficar fora do FOR e você tinha colocado dentro.

    Dei uma organizada no seu código.

    Dica: Procure sempre tipar suas variáveis. Isso ajuda a previnir problemas.

    Segue o algoritmo:

    Private Sub CommandButton1_Click()

    Dim count As Integer
    Dim count2 As Integer
    Dim value As String
    Dim achou As Boolean

        Unload Me
        count2 = 1

        'Neste momento estamos atribuindo o valor false a variável booleana
        achou = False

            'Enquanto o contador for menor que 20000 *que é o número de linhas pesquisadas* o DO WHILE não para
            Do While count < 20000
           
            'Atribuindo o primeiro valor encontrado a variável value
            value = Plan3.Range("A" & count2)

                If value = TextBox1.value Then
                'Se encontrar 1 valor que seja alteramos a variável booleana para true
                achou = True
                'Exibe o resultado encontrado
                MsgBox "NOME : " & Plan3.Range("B" & count2) & vbLf & Plan3.Range("C" & count2) & vbLf & Plan3.Range("D" & count2)
       
                End If
       
                count2 = count2 + 1
       
                If (VBA.IsEmpty(Plan3.Range("A" & count2))) Then
                'Se não encontrar nada atribui o valor false a variável booleana e exibe a msg de não encontrado
                    If achou = False Then
                        MsgBox "Não foi possível localizar a matrícula." & vbLf & "Verifique o valor digitado e refaça a sua busca."
                    End If
                    Exit Do
                End If
            Loop
    End Sub


    Carlos Carvalho Citrangulo Junior
    Microsoft Certified Professional
    Microsoft Certified Desktop Support Technician
    MCTS Microsoft Windows Vista Configuration
    MCITP Enterprise Support Technician
    Profissional 5 Estrelas Microsoft
    http://carloscitrangulo.wordpress.com
    • Sugerido como Resposta Carlos C Citrangulo Jr terça-feira, 17 de maio de 2011 16:41
    • Marcado como Resposta rsant quarta-feira, 18 de maio de 2011 14:18
    terça-feira, 17 de maio de 2011 16:41
  • BLZ!

    O código está funcionando Carlos, mas vamos aperfeiçoá-lo?

     

    É o seguinte: quando faço a pesquisa em minúsculo, se o que foi escrito no cadastro estiver em maiúsculo ele não localiza e vice versa, ou seja, de qual quer forma que eu escrever ele deve encontrar. Outro problema é; se eu tiver o nome exp; Maria Santos e Maria Madalena e eu colocar apenas Maria ele também não localiza, como resolver estes problemas?

    quarta-feira, 18 de maio de 2011 05:48
  • Opa bom dia!

    Vamos sim,

    Segue o algoritmo aperfeiçoado. As alterações estão em negrito.

    Private Sub CommandButton1_Click()

    Dim count As Integer
    Dim count2 As Integer
    Dim value As String
    Dim achou As Boolean


        Unload Me
        count2 = 1
        achou = False

            Do While count < 20000
            value = Plan3.Range("A" & count2)
                'VBA.InStr faz a função do * e a função Ucase transforma tudo para maiúsculo em segundo plano
                If VBA.InStr(VBA.UCase(value), VBA.UCase(TextBox1.value)) = 1 Then
                achou = True
                MsgBox "NOME : " & Plan3.Range("B" & count2) & vbLf & Plan3.Range("C" & count2) & vbLf & Plan3.Range("D" & count2)
       
                End If
       
                count2 = count2 + 1
       
                If (VBA.IsEmpty(Plan3.Range("A" & count2))) Then
               
                    If achou = False Then
                        MsgBox "Não foi possível localizar a matrícula." & vbLf & "Verifique o valor digitado e refaça a sua busca."
                    End If
                    Exit Do
                End If
            Loop
    End Sub

     

    Está feito e funcionando. Espero ter ajudado.

    Rsant como foi duas perguntas diferentes respondidas por favor marcar as duas como resposta.


    Carlos Carvalho Citrangulo Junior
    Microsoft Certified Professional
    Microsoft Certified Desktop Support Technician
    MCTS Microsoft Windows Vista Configuration
    MCITP Enterprise Support Technician
    Profissional 5 Estrelas Microsoft
    http://carloscitrangulo.wordpress.com
    • Sugerido como Resposta Carlos C Citrangulo Jr quarta-feira, 18 de maio de 2011 13:01
    • Marcado como Resposta rsant quarta-feira, 18 de maio de 2011 14:19
    quarta-feira, 18 de maio de 2011 13:01
  • Grato pelo apoio.

     

    quarta-feira, 18 de maio de 2011 14:22
  • Hum, surgio um outro problema.

    Seguinte; vamos supor que eu tenha em minha listas 05 marias cadastradas, o código vai pegar a primeira, depois a segunda, depois a terceira, e justamente esta é a que eu quero encontrar, porém este código não me dar  a opção de fechar a pesquisa. Ele ira percorre todo o arquivo ate encontrar a ultima, como faço para finalizar  procura quando eu encontra o que eu quero? Tentei fechar no X da caixa de dialogo e ainda assim ele continua pesquisando.

    quarta-feira, 18 de maio de 2011 14:36
  • Caro Rsanto,

    Segue a nova solução:
    As alterações estão em negrito.

     

    Private Sub CommandButton1_Click()

    Dim count As Integer
    Dim count2 As Integer
    Dim value As String
    Dim achou As Boolean


        Unload Me
        count2 = 1
        achou = False

            Do While count < 20000
            value = Plan3.Range("A" & count2)

                If VBA.InStr(VBA.UCase(value), VBA.UCase(TextBox1.value)) = 1 Then
                achou = True
                 MsgBox("NOME : " & Plan3.Range("B" & count2) & vbLf & Plan3.Range("C" & count2) & vbLf & Plan3.Range("D" & count2) 

                if msgbox ("Finalizar agora?", vbYesNo) = vbYes then
                Exit Sub
                Else
                End If
                End If
               
                count2 = count2 + 1
       
                If (VBA.IsEmpty(Plan3.Range("A" & count2))) Then
               
                    If achou = False Then
                        MsgBox "Não foi possível localizar a matrícula." & vbLf & "Verifique o valor digitado e refaça a sua busca."
                    End If
                    Exit Do
                   
                End If
            Loop
    End Sub


    Espero ter ajudado, se sim, por favor marcar como resposta.

    Abraços,

     


    Carlos Carvalho Citrangulo Junior
    Microsoft Certified Professional
    Microsoft Certified Desktop Support Technician
    MCTS Microsoft Windows Vista Configuration
    MCITP Enterprise Support Technician
    Profissional 5 Estrelas Microsoft
    http://carloscitrangulo.wordpress.com


    quarta-feira, 18 de maio de 2011 15:12
  • E não tem como colocar um botão de parar dentro do primeiro ""MsgBox "NOME : " & Plan3.Range("B" & count2) & vbLf & ...""?

    quinta-feira, 19 de maio de 2011 04:51
  • Olá bom dia!

    Tem sim....

    Segue o algoritmo:

    Private Sub CommandButton1_Click()

    Dim count As Integer
    Dim count2 As Integer
    Dim value As String
    Dim achou As Boolean

        Unload Me
        count2 = 1
        achou = False

            Do While count < 20000
            value = Plan3.Range("A" & count2)

                If VBA.InStr(VBA.UCase(value), VBA.UCase(TextBox1.value)) = 1 Then
                achou = True
                If MsgBox("Finalizar pesquisa?" & vbLf & vbLf & "NOME : " & Plan3.Range("B" & count2) & vbLf & Plan3.Range("C" & count2) & vbLf & Plan3.Range("D" & count2), vbYesNo) = vbYes Then
                Exit Sub
                Else
                End If
                End If
               
                count2 = count2 + 1
       
                If (VBA.IsEmpty(Plan3.Range("A" & count2))) Then
               
                    If achou = False Then
                        MsgBox "Não foi possível localizar a matrícula." & vbLf & "Verifique o valor digitado e refaça a sua busca."
                    End If
                    Exit Do
                   
                End If
            Loop
    End Sub

     

    Prontinho agora está em apenas um msgbox.


    Rsant como foi duas perguntas diferentes respondidas por favor marcar as duas como resposta.

    Abraços,

     


    Carlos Carvalho Citrangulo Junior
    Microsoft Certified Professional
    Microsoft Certified Desktop Support Technician
    MCTS Microsoft Windows Vista Configuration
    MCITP Enterprise Support Technician
    Profissional 5 Estrelas Microsoft
    http://carloscitrangulo.wordpress.com
    quinta-feira, 19 de maio de 2011 08:35
  • <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} p {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:70.85pt 3.0cm 70.85pt 3.0cm; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->


    Acho que vc deve estar me achando um chato, mas vamos ao ultimo problema.

    exp; tenho o nome Maria, só que esta forma de localizar só funciona se eu começar a escrever a partir  do primeiro caractere disponível, ou seja, se eu der um espaço e depois digitar o nome, quando eu fizer a pesquisa se eu não der o espaço ele não localiza. Outra coisa que percebi foi que se eu procurar por uma parte do texto que seja do meio ele não encontra explo RIA que é o final do nome MARIA.

    Acho q resolvendo isso eu finalizo e se vc puder mandar um link onde eu encontre material sobre vba eu agradeço, como nunca estudei a linguagem estou encontrando dificuldade até pq tem tempo que fiz programação.

     

    Grto,

    quinta-feira, 19 de maio de 2011 14:37
  • Olá rsant boa tarde,

    Não tem problema não, vamos a solução.

    As alterações estão em negrito.

    Private Sub CommandButton1_Click()

    Dim count As Integer
    Dim count2 As Integer
    Dim value As String
    Dim achou As Boolean


        Unload Me
        count2 = 1
        achou = False

            Do While count < 20000
            value = Plan3.Range("A" & count2)
           
                If VBA.InStr(VBA.UCase(value + "*"), VBA.UCase(Trim(TextBox1.value))) >= 1 Then
                achou = True
                If MsgBox("Finalizar pesquisa?" & vbLf & vbLf & "NOME : " & Plan3.Range("B" & count2) & vbLf & Plan3.Range("C" & count2) & vbLf & Plan3.Range("D" & count2), vbYesNo) = vbYes Then
                Exit Sub
                Else
                End If
                End If
               
                count2 = count2 + 1
       
                If (VBA.IsEmpty(Plan3.Range("A" & count2))) Then
               
                    If achou = False Then
                        MsgBox "Não foi possível localizar a matrícula." & vbLf & "Verifique o valor digitado e refaça a sua busca."
                    End If
                    Exit Do
                   
                End If
            Loop
    End Sub

     

    Legal você querer estudar, é isso aí mesmo, buscar conhecimento.

    Em meu blog a sessão de VBA iniciou semana passada, vou postar assunto de VBA pelo menos 2 vezes por semana, inclusive hoje vou blogar lá.

    Mas vou te passar mais um link bom de estudo com aula a aula (ingles) de VBA: http://www.excel-vba.com/excel-vba-contents.htm


    Rsant como foi três perguntas diferentes respondidas, por favor, marcar as três como resposta.

    Abraços,

     


    Carlos Carvalho Citrangulo Junior
    Microsoft Certified Professional
    Microsoft Certified Desktop Support Technician
    MCTS Microsoft Windows Vista Configuration
    MCITP Enterprise Support Technician
    Profissional 5 Estrelas Microsoft
    http://carloscitrangulo.wordpress.com
    • Sugerido como Resposta Carlos C Citrangulo Jr quinta-feira, 19 de maio de 2011 16:14
    • Marcado como Resposta rsant sexta-feira, 20 de maio de 2011 07:06
    quinta-feira, 19 de maio de 2011 16:14
  • Este último é o código completo e o que eu queria, ficou perfeito, grato pela ajuda e creio que não incomodarei mais com este assunto rsrsrsrsr

     

    Grato,

     

     

    sexta-feira, 20 de maio de 2011 07:59