Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

For Each Schleife rückwärts - Genie gegen Compiler
#1
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
Antworten Top
#2
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
Antworten Top
#3
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

Wissen ist Macht - es ist aber nicht schlimm nicht alles zu wissen.
Man muss nicht alles wissen - man muss nur wissen wo es steht, oder wo man Hilfe bekommt.
Antworten Top
#4
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
Antworten Top
#5
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.
Antworten Top
#6
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

Wissen ist Macht - es ist aber nicht schlimm nicht alles zu wissen.
Man muss nicht alles wissen - man muss nur wissen wo es steht, oder wo man Hilfe bekommt.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste