VBA - Procurar "Find" com retorno múltiplo

Fevereiro 2017



Uma simples busca "Find" faz você voltar à primeira coordenada encontrada.
Em determinadas circunstâncias, é preciso conhecer todos os detalhes das coordenadas das ocorrências encontradas.
É o que faz essa pequena função.

Em um módulo público


'Retorna todos os endereços encontrados na busca    
'WkbN = nome da pasta de trabalho, com este dado a função pode ser posta em um xla    
'WksN = nome da planilha    
'Trecho = coordenadas do trecho a ser percorrido.    
'Retorno à tabela dada como argumento.    
Function RechFind(ByVal Cle As String, ByVal WkbN As String, ByVal WksN As String, ByVal Plage As String, ByRef TBadress() As Variant) As Long    
Dim Cherche, Ix As Long, PrAddress    
    With Workbooks(WkbN).Sheets(WksN).Range(Plage)    
        Set Cherche = .Find(Cle)    
        If Not Cherche Is Nothing Then    
            PrAddress = Cherche.Address    
            Do    
                ReDim Preserve TBadress(Ix)    
                TBadress(Ix) = Cherche.Address    
                Set Cherche = .FindNext(Cherche)    
                Ix = Ix + 1    
            Loop While Not Cherche Is Nothing And Cherche.Address <> PrAddress    
        End If    
    End With    
    'número de ocorrências encontradas, Volta ao 0 se nenhuma ocorrência    
    RechFind = Ix    
    Set Cherche = Nothing 'Libera a memória ocupada pelo objeto.    
End Function


O corpo da função é separado para, eventualmente, ser colocado em uma pasta Xla.

Exemplo de chamada pela macro


Pode ser posto em um módulo da pasta "chamando"

Sub RechMulti()    
Dim R As Long, TB()    
Dim i As Integer    
    R = RechFind("12*", ThisWorkbook.Name, "Feuil1", "B1:B500", TB())    
    If R > 0 Then    
        For i = 0 To R - 1 ' ou ubound(TB)    
            'exemplo    
            Sheets("Plan1").Cells(i + 4, 5) = Range(TB(i)).Row    
        Next i    
    End If    
End Sub

Exemplo de chamada por botão


Private Sub CommandButton1_Click()    
Dim R As Long, TB()    
Dim i As Integer    
    Range("E4:E20").ClearContents    
    R = RechFind(Range("E2"), ThisWorkbook.Name, ActiveSheet.Name, Range("B1:B500").Address, TB())    
    If R > 0 Then    
        For i = 0 To R - 1 ' ou ubound(TB)    
            'exemplo    
            Sheets("Feuil1").Cells(i + 4, 5) = Range(TB(i)).Row    
        Next i    
    End If    
End Sub

Download


Se quiser um exemplo concreto Baixe esta pasta exemplo (em francês)


Tradução feita por Lucia Maurity y Nouira

Veja também

Artigo original publicado por . Tradução feita por pintuda. Última modificação: 26 de março de 2011 às 13:00 por pintuda.
Este documento, intitulado 'VBA - Procurar "Find" com retorno múltiplo', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.