cs_jordinette
Messages postés134Date d'inscriptionmercredi 2 mars 2005StatutMembreDernière intervention 5 avril 2007
-
7 mars 2005 à 08:35
Pierre_faucon
Messages postés96Date d'inscriptionjeudi 10 juin 2004StatutMembreDernière intervention22 mai 2007
-
7 mars 2005 à 13:10
bonjour à tous!
Sous VBa pour Excel, comment faire pour passer dans chaque cellule de la colonne sélectionné afin de vérifier si la valeur X est dans la cellule?
je pensais utiliser ça:
ActiveCell.EntireColumn.Select 'selection de la première colonne
For Each Cells In Selection
'instructions à faire si X est dans la cellule
Next Cells
mé j'arrive pas à le faire marcher.
bonne matinée
Jordinette
mrdep1978
Messages postés402Date d'inscriptionjeudi 25 novembre 2004StatutMembreDernière intervention 7 juin 20097 7 mars 2005 à 11:14
Cells est une propriété (de types tableau de Range) associé à l'objet Range (ou Worksheet), ce n'est donc pas une variable.
Tu dois définir une variable de type Range pour faire le parcours de ta boucle :
Dim l_Cell as Range
ActiveCell.EntireColumn.Select
For Each l_Cell in Selection
If l_Cell.Value = "X" Then
Debug.print l_Cell.Address
End IF
next l_Cell
Le pb de cette solution, c'est que tu vas parcourir systématiquement toute la colonne (=65000 lignes).
Je te conseille donc de faire comme ceci :
Dim l_Cell As Range 'Cellule de parcours
Dim l_Range As Range 'Zone à parcourir
'UsedRange.Row : Premiere ligne utilisée de la feuille
'UsedRange.Rows.Count : Nb de lignes utilisées
'ActiveCell.Column : Numéro de colonne de la cellule active
Set l_Range = Range(Cells(UsedRange.Row, ActiveCell.Column), _
Cells(UsedRange.Row + UsedRange.Rows.Count - 1, ActiveCell.Column))
For Each l_Cell In l_Range
If l_Cell.Value = "X" Then
Debug.Print l_Cell.Address
End If
Next l_Cell
Pierre_faucon
Messages postés96Date d'inscriptionjeudi 10 juin 2004StatutMembreDernière intervention22 mai 2007 7 mars 2005 à 13:10
Bonjour Jordinette,
Voici une autre méthode qui utilise les méthodes Find et FindNext d'excel ( un peu comme la boite de dialogue. Dans la macro que je te propose, la correspondance est partielle (lookat:=xlpart), mais tu peux également demander une correspondance stricte (lookat:=xlwhole).
( Extrait de ma réponse de vendredi sur le même forum... )
Il faut mémoriser la première cellule correspondant à la recherche, de manière à comparer les adresses des cellules suivantes trouvées et de sortir de la boucle lorsque Excel revient sur la première cellule.
Il faut également, lors du FindNext, spécifier à Excel de chercher après la cellule trouvée...
Voici le code complet, à adapter selon tes besoins. Dans le cas présent, Excel colorie les cellules trouvées en rouge. Tu peux bien sûr adapter en renvoyant les adresses dans un tableau ou une collection, puis itérer sur le tableau ou la collection des adresses trouvées.
Sub Recherche()
Dim Premiere_Cellule_Trouvee As Range ' Sert à éviter une boucle sans fin
Dim Cellule_Suivante As Range ' Correspond à la cellule suivante trouvée
Set Premiere_Cellule_Trouvee = _
Range("a1:a10").Find(What:="elec", LookIn:=xlValues, LookAt:=xlPart)
' Si aucune correspondance, on sort de la procédure
If Premiere_Cellule_Trouvee Is Nothing Then Exit Sub
Set Cellule_Suivante = Premiere_Cellule_Trouvee
Do
Cellule_Suivante.Interior.Color = vbRed
Set Cellule_Suivante = Range("a1:a10").FindNext(after:=Cellule_Suivante)
' Si correspondance entre les cellules, on a bouclé et on sort
If Cellule_Suivante Is Nothing Then Exit Sub
If Cellule_Suivante.Address = Premiere_Cellule_Trouvee.Address Then Exit Sub
Loop
End Sub