Boucle à l'envers

BenHarber

XLDnaute Occasionnel
Bonjour Le Forum,
Pour passer en revue une zone déterminée (que je nomme 'znWrk') j'ai pris l'habitude d'utiliser le type de code suivant :

Dim znWrk As Object, cWrk As Object
Set znWrk = ThisWorkbook.Sheets(1).Range("A1:A" & Sheets(1).[A65536].End(xlUp).Row)
For Each cWrk In znWrk
'TRAITEMENT macro'
Next cWrk

Je passe ainsi en revue chaque cellule de la zone en ORDRE CROISSANT, càd en partant de 'A1' jusqu'à la dernière cellule non vide de la colonne A.

Question : y-a-t-il possibilité de les passer en revue dans l'odre DECROISSANT (càd de la dernière cellule non vide de la colonne A jusqu'à 'A1'). Si oui, quel est le code ?

Merci d'avance pour vos suggestions.

PS : je connais le truc qui consiste à mettre en variable le n° de la ligne de la dernière cellule, puis à faire une boucle décroissante du style :
i=[A65536].End(xlUp).Row
For j = i to 1 Step -1
....etc....

Là, je voudrais savoir s'il existe une possibilité de balayer directement ''à l'envers'' une collection d'objets...(mais peut-être que cela n'existe pas !!??)

Cordialement,
BenHarber
 

chris

XLDnaute Barbatruc
Re : Boucle à l'envers

Bonjour

Une solution
Code:
Sub test()

Dim fin As Integer
fin = ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Row
For i = fin To 1 Step -1
'TRAITEMENT macro exemple
    Range("A" & i) = Range("A" & i) + 100
Next
End Sub
 

ROGER2327

XLDnaute Barbatruc
Re : Boucle à l'envers

Re...
Bonjour

Une solution
Code:
Sub test()

Dim fin As Integer
fin = ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Row
For i = fin To 1 Step -1
'TRAITEMENT macro exemple
    Range("A" & i) = Range("A" & i) + 100
Next
End Sub
C'est effectivement une solution efficace (déjà évoquée plus haut par BenHarber), mais je crois que, comme moi, il songe à une solution du type For Each... ...Next qui fonctionnerait "à l'envers", sans utilisation d'un indice de ligne explicite.
Un genre de Step -1 applicable à la structure For Each... ...Next, en quelque sorte.​
ROGER2327
 

BenHarber

XLDnaute Occasionnel
Re : Boucle à l'envers

Bonjour Chris, ROGER2327,
Tu as raison Roger : je recherche éventuellement une solution style "For Each... ...Next qui fonctionnerait "à l'envers" (Et n'allez pas croire que c'est une blague belge qui consisterait à remonter la boucle...à l'Anvers !).....bon, je vais retourner me coucher.....
 

mutzik

XLDnaute Barbatruc
Re : Boucle à l'envers

bonjour à tous,
je ne sais pas trop si je suis à coté du sujet, mais une collection d'objet a une propriété count avec laquelle on peut boucler (à l'envers).
Mais peut-etre que les indices de ces objets sont indicés dans l'ordre de création des objets.
sinon on peut, pour chaque objet mettre l'adresse de sa cellule dans une collection, puis trier cette collection

enfin ce que j'en dis, ce sont des pistes que j'explorerai si je devrais être confronté à ce probleme
lol : mais pour le résoudre, je ferai appel à un certain site XL ... que vous connaissez fort bien
 

CISCO

XLDnaute Barbatruc
Bonjour à tous, bonjour Roger2327, bonjour Chris, bonjour Mutzik, bonjour tototiti2008, bonjour BenHarber

Depuis 2009, y aurait-il eu une évolution sur ce sujet, le parcours d'une plage à partir de la fin, sans utiliser de boucles sur le numéro de la ligne et/ou le numéro de la colonne ?

@ plus

P.S : En plus, dans mon cas, la plage n'est pas rectangulaire....:eek:
plage.PNG
 

soan

XLDnaute Barbatruc
Inactif
Bonjour dyso, le fil,

petite rectification :

il faut choisir une solution du genre :

VB:
For i = 200 To 1 Step -1
  'ici : code VBA à exécuter dans la boucle
Next i

je veux dire que le Step est sur la ligne du For, et pas à droite du Next ; c'est bien sûr évident pour ceux qui connaissent déjà, mais je préfère le préciser pour ceux qui connaissent moins bien. :)

soan
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Il est toujours possible éventuellement possible de faire un Set Cel = LaDernièreCellule, puis Do While Cel.Address <> La1èreCellule.Address, le traitement avec Cel, enfin If Cel.Column=La1èreColonne Then Set Cel = Cel.Offset(-1, LeNombreDeColonnes - 1) Else Set Cel = Cel.Offset(, -1) et Loop
Mais ce serait plus simple quand même d'utiliser des indices L et C et Set Cel = Cells(L, C)
 

Discussions similaires

Statistiques des forums

Discussions
312 176
Messages
2 085 955
Membres
103 059
dernier inscrit
gib17