XL 2016 Methode find sans select ne marche pas

sebastien450

XLDnaute Occasionnel
Bonjour,
Tout est dit, après des heures de recherches, je n'arrive pas à appliquer une methode find si je ne fait pas select sur la feuille avant.
Ci-dessous le code (très classique...). J'ai du louper quelque chose.
VB:
With Worksheets("Feuil2")
        Set d = .Range(Cells(2, 3), Cells(1000, 3)).Find("MACIBLE", LookIn:=xlValues)
        If Not d Is Nothing Then
            firstAddress = d.Address
            Do
                MsgBox d.Row ' la ligne de MACIBLE'
                Set d = .Range(Cells(2, 3), Cells(1000, 3)).FindNext(d)
            Loop While Not d Is Nothing
        End If
End With
 
C

Compte Supprimé 979

Guest
Bonjour Sebastien450

Oui effectivement, vous ne définissez pas la plage dans la feuille de recherche

Ne jamais oublier le "." POINT devant Cells() pour qu'il se rapporte à l'objet conteneur

VB:
With Worksheets("Feuil2")
  Set d = .Range(.Cells(2, 3), .Cells(1000, 3)).Find("MACIBLE", LookIn:=xlValues)
  If Not d Is Nothing Then
    firstAddress = d.Address
    Do
      MsgBox d.Row ' la ligne de MACIBLE'
      Set d = .Range(.Cells(2, 3), .Cells(1000, 3)).FindNext(d)
    Loop While Not d Is Nothing
  End If
End With

A+
 

patricktoulon

XLDnaute Barbatruc
Bonjour @sebastien450 , @BrunoM45
le findnext se fait jusqu'au retour de firstaddress
et pour être précis puisque visiblement la recherche est sur la valeur complète

1°dimez vos variables !!!
2° ajouter xlwhole
3°limittez la plage de recherche a ce qui est utilisé (on économise un peu)

VB:
Dim d As Range
With Worksheets("Feuil2")
    With .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp))
        Set d = .Find("MACIBLE", LookIn:=xlValues, Lookat:=xlWhole)
        If Not d Is Nothing Then
            firstAddress = d.Address
            Do
                MsgBox d.Row    ' la ligne de MACIBLE'
                Set d = .FindNext(d)
            Loop While Not d Is Nothing And d.Address <> firstAddress
        End If
    End With
End With
1642840646991.png


cela dit un simple autofilter sur la plage complète sur le field3 (colonne"c") serait largement plus rapide pour stoker les lignes dans une variable avec le .specialcells(xlvisible) de la plage
 

sebastien450

XLDnaute Occasionnel
Merci,

Je n'ai mis qu'une partie du code, mes variables sont bien DIM.
Un autofilter ne seras pas ( je pense) adapté, car "MACIBLE" est une variable qui prends une centaine de variations.
Pour la plage de recherche, j'ai déja une variable der_ligne en place.

Pourquoi utiliser with, alors que l'on peut tout afficher sur la même ligne?
VB:
Dim d As Range

    With Worksheets("Feuil2").Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp))
        Set d = .Find("MACIBLE", LookIn:=xlValues, Lookat:=xlWhole)
        If Not d Is Nothing Then
            firstAddress = d.Address
            Do
                MsgBox d.Row    ' la ligne de MACIBLE'
                Set d = .FindNext(d)
            Loop While Not d Is Nothing And d.Address <> firstAddress
        End If
    End With
 

patricktoulon

XLDnaute Barbatruc
re
par ce que ça te simplifie la lisibilité du code et tu évite de demander au calculateur de re déterminer la plage une 2d fois
ton code
VB:
Set d = .Range(.Cells(2, 3), .Cells(1000, 3)).Find("MACIBLE", LookIn:=xlValues)'tu détermine la plage en même temps que le find
 'blablabla
  Do
    'blablablabla
    Set d = .Range(.Cells(2, 3), .Cells(1000, 3)).FindNext(d)'ici tu re!!!! détermine la plage avant le findnext

apprenez a coder intelligemment;)
c'est ces petits détails quand on les maîtrises qui font qu'une app est pérenne ou pas
dans ma version elle n'est déterminée qu'une seul fois ;)

et puis ta variable derlign ,si elle te sert a autre chose (plus tard dans le code )d'accords sinon elle est inutile
Code:
With Worksheets("Feuil2")
    With .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp))
ta plage est parfaitement déterminée ici sans variable ( et allez!!! on économise encore) sans variable
les blocs with servent a travailler sur l'object ou autre désigné sans devoir re codé la designation
ici par exemple on désigne une plage pour recherche
on appelle ça un object anonyme car il est identifié uniquement dans le bloc with lui même
ET!!! qu'une seule fois !!!!!

voilà voilà ;)
c’était la leçon du jour ;)

oserais je dire que là je revient près de 20 ans en arrière a travailler avec une plage -->end(xlup)
alors qu'avec un tableau structuré les choses seraient tellement plus simple 😁

qui travaillent encore aujourd'hui avec des plage variable?? :oops:
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Pourquoi utiliser with, alors que l'on peut tout afficher sur la même ligne?
Non: Erreur de compilation: Référence incorrecte ou non qualifiée.
Vous pouvez tout au plus, si vous tenez à n'avoir qu'un With, éviter un 3ème Worksheets("Feuil2") à l'aide d'un Resize :
VB:
With Worksheets("Feuil2").Cells(2, 3).Resize(Worksheets("Feuil2").Cells(1000000, 3).End(xlUp).Row - 1)
Personnellement je préfère plus cout, surtout si Feuil2 est aussi le nom de l'objet Worksheet installé par l'application hôte pour représenter cette feuille, également reproduit dans sa propriété String en lecture seule CodeName :
VB:
With Feuil2.[C2].Resize(Feuil2.[C1000000].End(xlUp).Row - 1)
 

Statistiques des forums

Discussions
311 725
Messages
2 081 947
Membres
101 849
dernier inscrit
florentMIG