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