Registriert seit: 25.09.2014
Version(en): 2010-2013
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
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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
Registriert seit: 11.04.2014
Version(en): Office 2003 - Office 2007 - Office 365
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.
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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
Registriert seit: 25.09.2014
Version(en): 2010-2013
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.
Registriert seit: 11.04.2014
Version(en): Office 2003 - Office 2007 - Office 365
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.