none
Busca VBA - Em diferentes colunas RRS feed

  • Pergunta

  • Muito Boa Tarde, Galera!!

    Tenho uma dúvida:

    Estou construindo um form que vai buscar o nome de determinada pessoa em 4 colunas diferentes em uma planilha e retornará as informações daquela pessoa para o form.

    A título de exemplo, digamos que busquemos pelo nome João.  Então um busca pelas colunas D, E, F e G deverá ser realizada no sentido de averiguar se o tal do João está em uma qualquer dessas colunas.

    Depois disso, ele deverá retornar os dados cadastrais do João, contidos nas colunas  A, B, C e H, para os textboxs do form.

    Apenas para ressaltar, o João seria a referência, mas pode aparecer em quatro colunas diferentes.

    Alguém poderia me dar um help?!


    Obrigado, Everton

    quarta-feira, 16 de maio de 2012 18:02

Respostas

  • Nomeie a primeira linha de caixas de texto como:

    txtCod1, txtProd1, txtValor1

    A segunda linha:

    txtCod2, txtProd2, txtValor2

    E assim por diante.

    Sub Exemplo()
        Dim l As Long
        Dim lControle As Long
        Dim s As String
        Dim r As Range
        Dim rBanco As Range
        
        Set rBanco = Columns("D:G")
        
        Set r = Buscar("João", rBanco)
        
        If Not r Is Nothing Then
            s = r.Address
            Do
                l = r.Row
                lControle = lControle + 1
                Controls("txtCod" & lControle).Text = Cells(l, "A")
                Controls("txtProd" & lControle).Text = Cells(l, "B")
                Controls("txtValor" & lControle).Text = Cells(l, "C")
                Set r = rBanco.FindNext(r)
            Loop While r.Address <> s
        Else
            'Não foi encontrada nenhuma ocorrência!
        End If
    End Sub
    
    Function Buscar(sTermo As String, rBanco As Range) As Range
        Set Buscar = rBanco.Find(What:=sTermo _
          , After:=rBanco.Cells(1) _
          , LookIn:=xlValues _
          , LookAt:=xlWhole _
          , SearchOrder:=xlByColumns _
          , SearchDirection:=xlNext _
          , MatchCase:=True _
          , SearchFormat:=False)
    End Function


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta almeida.eas segunda-feira, 11 de junho de 2012 18:15
    sábado, 19 de maio de 2012 19:21
    Moderador

Todas as Respostas

  • Sub Exemplo()
        Dim r As Range
        Dim l As Long
        
        Set r = Buscar("João", Columns("D:G"))
        
        If Not r Is Nothing Then
            'Foi encontrado "João" no intervalo D:G.
            l = r.Row
            TextBox1 = Cells(l, "A")
            TextBox1 = Cells(l, "B")
            TextBox1 = Cells(l, "C")
            TextBox1 = Cells(l, "H")
        Else
            'Não foi encontrada nenhuma ocorrência!
        End If
    End Sub
    
    Function Buscar(sTermo As String, rBanco As Range) As Range
        Set Buscar = rBanco.Find(What:=sTermo _
          , After:=rBanco.Cells(1) _
          , LookIn:=xlValues _
          , LookAt:=xlWhole _
          , SearchOrder:=xlByColumns _
          , SearchDirection:=xlNext _
          , MatchCase:=True _
          , SearchFormat:=False)
    End Function


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quinta-feira, 17 de maio de 2012 01:02
    Moderador
  • Felipe, muito obrigado pela ajuda. Mas não deu certo.

    Acontece que para o nome João pode haver mais de uma ocorrência.

    O Form é o seguinte*:

    *Eu não tenho um botão, msm! A ídeia é que o Fornecedor venha de outro Form, no evento  Userform_Initialize(), e o mesmo evento chame a sub que fará a busca.


    Obrigado, Everton

    quinta-feira, 17 de maio de 2012 17:08
  • Nomeie a primeira linha de caixas de texto como:

    txtCod1, txtProd1, txtValor1

    A segunda linha:

    txtCod2, txtProd2, txtValor2

    E assim por diante.

    Sub Exemplo()
        Dim l As Long
        Dim lControle As Long
        Dim s As String
        Dim r As Range
        Dim rBanco As Range
        
        Set rBanco = Columns("D:G")
        
        Set r = Buscar("João", rBanco)
        
        If Not r Is Nothing Then
            s = r.Address
            Do
                l = r.Row
                lControle = lControle + 1
                Controls("txtCod" & lControle).Text = Cells(l, "A")
                Controls("txtProd" & lControle).Text = Cells(l, "B")
                Controls("txtValor" & lControle).Text = Cells(l, "C")
                Set r = rBanco.FindNext(r)
            Loop While r.Address <> s
        Else
            'Não foi encontrada nenhuma ocorrência!
        End If
    End Sub
    
    Function Buscar(sTermo As String, rBanco As Range) As Range
        Set Buscar = rBanco.Find(What:=sTermo _
          , After:=rBanco.Cells(1) _
          , LookIn:=xlValues _
          , LookAt:=xlWhole _
          , SearchOrder:=xlByColumns _
          , SearchDirection:=xlNext _
          , MatchCase:=True _
          , SearchFormat:=False)
    End Function


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta almeida.eas segunda-feira, 11 de junho de 2012 18:15
    sábado, 19 de maio de 2012 19:21
    Moderador
  • Benzadeus, ainda não foi bem isso!

    Mas deixei esse projeto parado. Estou trabalhando em outra coisa com Access - a idéia é a mesma, por isso talvez mude tudo. Não sei sobre seu conhecimento sobre SQL em Access, mas criei um outro post, quem sabe vc possa me ajudar:

    http://social.msdn.microsoft.com/Forums/pt-br/520/thread/c47643c1-b9b0-4978-bb14-82eddf96a4f1

    Abs!


    Obrigado, Everton

    segunda-feira, 11 de junho de 2012 18:15