XL 2019 VBA & Find plus leger

sebastien450

XLDnaute Occasionnel
Bonjour,
J'utilise depuis longtemps cette trame de find mais qui est lourde à insérer car parfois imbriquée plusieurs fois,
Avez-vous une piste pour alléger, la difficulté étant une recherche qui ne s'arrête pas au premier objet trouvé!

VB:
Set plage = Range(Cells(6, R2 - 48), Cells(213, R2 + 100)) ' sur ma plage de R2-48h à R2 +1000
                                                          With plage 'defini le range de travail, qui va devenir variable
                                                            Set c = .Find("CIBLE", LookIn:=xlValues, lookat:=False)
                                                            If Not c Is Nothing Then
                                                                Add1 = c.Address
                                                              Do
                                                                    'MsgBox c.Row & c.Column
                                                                Set c = .FindNext(c)
                                                              Loop While Not c Is Nothing And c.Address <> Add1
                                                            End If
                                                          End With

Merci

Sébastien
 

job75

XLDnaute Barbatruc
Bonjour sebastien450, le forum,

En effet la méthode Find n'est pas très rapide, il vaut mieux utiliser un tableau VBA (matrice) :
VB:
Set plage = Range(Cells(6, R2 - 48), Cells(213, R2 + 100))
ncol = plage.Columns.Count
tablo = plage 'matrice, plusrapide
For i = 1 To UBound(tablo)
    For j = 1 To ncol
        If UCase(tablo(i, j)) = "CIBLE" Then
            'code si la valeur est trouvée
        End If
Next j, i
Nota : ici R2 est une variable, si c'est une cellule la remplacer par [R2]

Edit : pour une recherche partielle utiliser If UCase(tablo(i, j)) Like "*CIBLE*" Then

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Mais je ne trouve pas comment récupérer l'adresse, car du coup la position est relative.
Une adresse c'est une adresse :
VB:
Set plage = Range(Cells(6, R2 - 48), Cells(213, R2 + 100))
ncol = plage.Columns.Count
tablo = plage 'matrice, plusrapide
For i = 1 To UBound(tablo)
    For j = 1 To ncol
        If UCase(tablo(i, j)) = "CIBLE" Then mes = mes & " - " & plage(i, j).Address(0, 0)
Next j, i
MsgBox "'CIBLE' " & IIf(mes = "", "non trouvé", "trouvé en " & Mid(mes, 4))
 

Statistiques des forums

Discussions
311 720
Messages
2 081 896
Membres
101 833
dernier inscrit
sandra25