Les Allergies
Alimentaires

VBA - Recherche Find avec retour multiple



Une simple recherche Find vous retourne la première coordonnée trouvée.
Dans certaines circonstances il est nécessaire de connaître toutes les coordonnées des occurrences trouvées.
C'est ce que fait cette petite fonction.



Dans un module public


'Retourne toutes les adresses trouvées dans la recherche
'WkbN = nom du classeur, avec cette donnée la fonction peut être mise dans un xla
'WksN = nom de la feuille
'Plage = les coordonnées de la plage à parcourir.
'Retour dans le tableau donner en argument.
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
    'nombre d'occurence(s) trouvée(s), Retour 0 si aucune occurence
    RechFind = Ix
    Set Cherche = Nothing 'Libére la mémoire occupée par l'objet.
End Function

Le corps de la fonction est séparé pour éventuellement être mis dans un classeur Xla.

Exemple d'appel par macro


Peu être mis dans un module du classeur "appelant"
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)
            'exemple
            Sheets("Feuil1").Cells(i + 4, 5) = Range(TB(i)).Row
        Next i
    End If
End Sub

Exemple d'appel par bouton


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)
            'exemple
            Sheets("Feuil1").Cells(i + 4, 5) = Range(TB(i)).Row
        Next i
    End If
End Sub

Télécharger


Si vous souhaitez un exemple concret Vous pouvez télécharger le classeur exemple
Publié par lermite222 - Dernière mise à jour le 22 septembre 2009 à 10:33 par irongege
Ce document intitulé « VBA - Recherche Find avec retour multiple » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Suggestions
  •  VBA - Recherche Find avec retour multiple
  •  Vba Excel Chaine caractère recherche multiple (Résolu) » Salut, Je voudrais écrire une macro excel pour vérifier si ce que contient ma cellule appartient à une liste de valeurs que j'ai définie ou qui est présente dans une plage de cellules que j'indique dans ma macro. Si oui la macro devra faire telle...
  •  Vba excel : utilisation de .Find et Offset (Résolu) » Bonjour, Voilà j'ai créé un code vba excel et j'aimerais avoir si il est possible de l'alléger. En fait je suis sur un userform et j'aimerais pouvoir trouver sur une feuille précise (sheets("STOCKS") la valeur du textbox1 et pouvoir décaler 2 lignes...
  •  [vba] recherche d'une valeur EXACTE (Résolu) » Meilleure réponse: Bonjour, La méthode Find admet un argument facultatif de type variant "Lookat", les valeurs possibles sont xlWhole ou xlPart... En reprenant ton exemple, ça fait : Public Sub test() Dim numéro As Integer Dim celluletrouvee As Range Dim
  •  VBA excel problème de copier/coller filtre (Résolu) » Meilleure réponse: une solution... Dim CelR As Range Sheets(z).Select Set CelR = ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible) CelR.Select a = CelR.Address if len(a)>11 then 'Il y a une ou plusieurs lignes à copier. celR.copy Range("A9") end if
  •  VBA Récupérer coordonnées d'une cellule (Résolu) » Meilleure réponse: bonsoir essaies localise = Cells.Find("bonjour", , xlValues).Address MsgBox localise
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?
VBA - Tester une plage qui contient des cellules fusionnées
VBA - Message pour faire patienter l'utilisateur