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))
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
288 664
Messages
1 893 836
Membres
170 100
dernier inscrit
El Chino Loco
Haut Bas