locked
Criar via codigo VBA uma busca por diversas planilhas da pasta RRS feed

  • Pergunta

  • A minha pasta de trabalho possui tres planilhas distintas. No entanto os titulos de linha coincidem. Tanto a plan1, quanto a plan2, quanto a plan 3 possuem na linha de título "Matrícula". Eu criei um userform no qual coloquei um botão de comando para fins localização de determinado funcionário pela matrícula. A busca deve ser feita em todas as planilhas e o resultado deverá retornar uma msgbox contendo os dados referentes aquela matrícula e em qual planilha que o funcionário se encontra. Será que alguém pode me ajudar?

    domingo, 24 de fevereiro de 2008 02:28

Todas as Respostas

  • Alexandre,

    Para começar a ajudá-lo, montei o código abaixo.

    Parti do pressuposto que o nº da matrícula está na coluna 1.

    O resultado final é uma msgbox com os endereços de planilha é célula onde foram localizados os valores pesquisados.

    Vc precisa fornecer o valor a ser pesquisado (variável ValorPesquisado), através de um elemento do teu userform ou de outro input para rodar a macro.

    Peço que dê uma olhada e depois vamos ajustando para atender à tua soliciatação.

     

    Code Snippet

    Sub Pesquisa()

    Dim Planilha
    Dim firstAddress
    Dim Address
    Dim c
    Dim Texto
    Dim k
    Dim ValorPesquisado

    For Each Planilha In ThisWorkbook.Sheets
    With Planilha.Columns(1)
        Set c = .Find(ValorPesquisado, LookIn:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            k = 0
            Do
                Address = c.Address
                If Address = firstAddress And k > 1 Then Exit Do
                Texto = Texto & Planilha.Name & "!" & Address & vbLf
                Set c = .FindNext(c)
                k = k + 1
            Loop While Not c Is Nothing
        End If
    End With
    Next Planilha
    MsgBox "Valores encontrados em:" & vbLf & Texto
    End Sub

     

     

    [ ]s

    domingo, 24 de fevereiro de 2008 23:31
  • Obrigado pelo esforço Adilson,

    Tentarei me explicar melhor Seria igual quando, no excel, acessa-se o menu EDITAR / LOCALIZAR, ou simplesmente utilizando o atalho Ctrl + L. O que eu preciso é daquela janela que se abre utilzando o referido atalho, porém, o valor ou nome que eu digitar ali seja pesquisado em todas as planilhas. Suponha que eu procure por uma matricula 22.236 a busca será feita na primeira planilha, não encontrando passa para segunda planilha e assim sucessivamente até achar a matricula. Achando-a, surge então uma msgbox com a matricula, o nome e outros dados inerentes a linha onde a matricula for encontrada, além do nome da planilha em que houve a localização. Por exemplo, a matricula foi encontrada na célula A22, então msgbox conterá além do nome da planilha o que tiver digitado nas colunas A22, A23, A24.

     

    Grato

    segunda-feira, 25 de fevereiro de 2008 03:51
  • Olá, Alexandre.

    Segue no link abaixo, o arquivo que usa a lógica do código anterior associada a um caixa de diálogo acionada pelo botão Pesquisa localizado na Plan1.

    Acredito que vc quer que sejam retornados os valores de B22, C22 e D22, no exemplo que citou, pois essas seriam as colunas adjacentes. É isso mesmo?

    Não é uma solução definitiva, mas podemos ajustá-la para atendê-lo.

    Peço que analise e me dê um retorno.

    http://www.4shared.com/file/38882203/3d4f02/Pesquisar_Valores.html

    [ ]s

     

    segunda-feira, 25 de fevereiro de 2008 12:52


  • Olá Adilson, obrigado pelo esforço. Eu implementei o seu código na minha pasta de trabalho e funcionou corretamente. Fiz uma modificação mínima no modo como os dados serão retornados (está em vermelho). Segue o código.

    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 & "Na planilha " & Planilha.Name & " na célula " & "!" & Address & vbCr
             
     
      'Somente o conteúdo das células igual a planilha
      Texto = Texto & ValorColB & vbTab & ValorColC & vbTab & ValorColD
               
                ' Texto = Texto & vbLf & vbLf & " CAMPO1: " & ValorColB
                ' Texto = Texto & vbLf & vbLf & " CAMPO2: " & ValorColC
                ' Texto = Texto & vbLf & vbLf & " CAMPO3: " & ValorColD
           Exit For
                'Set c = .FindNext(c)
            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 "O item solicitado foi localizado na: " & Texto
    End If
    End Sub

    No entanto verifiquei que quando eu faço a busca por um outro campo que não seja matrícula o valor retornado se limita ao nome da planilha e localização do valor solicitado. Tem como melhorar isso na pesquisa?
    Outra fator que reparei é que caso eu procure por um nome, o meu por exemplo (Alexandre), será localizada somente a primeira ocorrência e se houverem outras não serão encontradas. Eu verifiquei que você deixou como comentário            Set c = .FindNext(c) que seria localizar a próxima, porém eu não conseguir fazer funcionar. E por último saber se há a possibilidade de me explicar a instrução set utilizada pois sou novato em programação. (alexandremagno76@gmail.com)

    terça-feira, 26 de fevereiro de 2008 23:18
  • Alexandre,

    As duas mudanças podem ser realizadas, mas antes de implementá-las, gostaria de saber se é possível me enviar uma cópia do arquivo (adilsonsoledade@hotmail.com) e um detalhamento de tudo que vc gostaria que fosse realizado.

    Quanto ao uso de Set, por exemplo

    Code Snippet
    Set Planilha = Worksheets("Exemplo")

     

     

    significa que está sendo atribuída à variável Planilha, uma planilha do arquivo ativo de nome Exemplo. Com base nesta atribuição quaisquer alterações realizadas sobre a vairável Planilha serão refletidas na planilha Exemplo. O comando abaixo, por exemplo, muda a formatação das células da variável objeto Planilha para negrito.

    Code Snippet
    Planilha.Cells.Font.Bold = True

     

     

    O resultado é refletido na planilha "Exemplo".

    [ ]s

    terça-feira, 26 de fevereiro de 2008 23:55