Clever-Excel-Forum

Normale Version: For Each Schleife rückwärts - Genie gegen Compiler
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo VBA Spezialisten,

ich habe folgendes Problem. Ich möchte gerne eine For Each Schleife rückwärts laufen lassen.
So etwas ist wahrscheinlich alles andere als einfach, aber irgendeinen Trick muss es doch geben?!
Vielleicht habt ihr ja eine Idee.

Code:
Sub ForEachReverse()
Dim i As Integer
Letzte = Range("A" & Rows.Count).End(xlUp).Row
Range("A1:A" & Letzte).Select

'Vorwärts geht:
For Each Zelle In Selection
MsgBox Zelle.Row
Next Zelle

i = Letzte
Rückwärts (geht nicht!!):
For Each Zelle In Selection
MsgBox Zelle.Offset(i, 0).Row
i = i - 1
Next Zelle

End Sub
Hallo Wulfi,

das ist eine Sache, die ich auch sehr vermisse.
Rückwärts geht es leider nur mit Zählschleife(n).

Code:
Sub ForEachReverse()
  Dim i As Long
  Dim rngB As Range, rngZ As Range
  Set rngB = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
  
  'Vorwärts geht:
  For Each rngZ In rngB
    MsgBox rngZ.Row
  Next rngZ
  
  'Rückwärts geht so:
  For i = rngB.Rows.Count To 1 Step -1
    MsgBox rngB.Cells(i, 1).Row
  Next i
End Sub

Gruß Uwe
Hallo Uwe,

Du warst schneller ... und ich merke wie ich us der Übung bin. Ich hatte es jetzt so gelöst:
Code:
Option Explicit

Sub ForEachReverse()
Dim zelle As Range
Dim letzte As Long
letzte = Range("A" & Rows.Count).End(xlUp).Row
    For Each zelle In Selection
    MsgBox zelle.Row
    'MsgBox letzte.Offset(letzte, 0).Row
    Range("A1:A" & letzte).Select
    letzte = letzte - 1
    Next zelle
End Sub

Naja ... es wurde wohl geholfen und das zählt :21:

Gruß
Marcus
Hallo Marcus,

hab Deinen Code so ergänzt, dass er richtig läuft und getestet.

Code:
Sub ForEachReverse_marose67()
Dim zelle As Range
Dim letzte As Long
letzte = Range("A" & Rows.Count).End(xlUp).Row
Range("A1:A" & letzte).Select
    For Each zelle In Selection
     MsgBox zelle.Row
    'MsgBox letzte.Offset(letzte, 0).Row
    Range("A1:A" & letzte).Select
    letzte = letzte - 1
    Next zelle
End Sub

Es geht aber trotzdem nicht rückwärts.
Es ist unerheblich, was innerhalb der Schleife neu selektiert wird.
Maßgeblich ist der angegebene Bereich in der Startzeile der Schleife.

Gruß Uwe
Hallo Leute,
ihr seid ja sauschnell. Danke! - Was haltet ihr denn von der Idee wenn man eine Hilfsspalte mit fortlaufenden Zahlen einfügt
und dann per Sortierung die zu abzuarbeitenden Zellen umdreht. Denn soviel ich weiß wird mit der For Each Schleife
ja irgendwie alles gleichzeitig abgearbeitet während die Zählschleifen ja doch verhältnismäßig langsam sind.
Hall Wulfi,

Zählschleifen relativ langsam ... Naja. Also ich habe bis jetzt fast alles mit Zählschleifen gemacht. Ich denke einmal dass es darauf ankommt was Du machen willst. Hast Du eine Stoppuhr? Vielleicht am Handy? OK - dann lege Dir diese beiden Codes einmal hinter dein Tabellenblatt (VBA Editor) und starte sie nacheinander:

Code:
Option Explicit

Sub Zaehlen1()
Dim i As Long
For i = 1 To 100000
    [A1] = i
Next
End Sub

Option Explicit

Sub Zaehlen2()
Dim i As Long
Application.ScreenUpdating = False
For i = 1 To 100000
    [A1] = i
Next
Application.ScreenUpdating = True
End Sub

Hier wird beide Male eine For - Next Schleife abgefahren. Und das 100000 mal. In Zelle A1 des Tabellenblattes wird beide Male die Zahl hochgezählt. Unterschied ist, dass beim 2ten Code der Bildschirm nicht aktualisiert wird und der Code somit viel schneller durchlaufen kann.

Natürlich kannst Du auch mit einer Hilfsspalte arbeiten. Auch hier bleibt immer die Frage was Du machen willst. Vielleicht benötigst Du ja auch gar kein VBA. Es gibt Formelgötter, welche Formeln erstellen ... da kann ich bei weitem nicht, mit meinem Wissen, mithalten.

Gruß
Marcus