Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: For each-Schleife von unten anfangen lassen

For each-Schleife von unten anfangen lassen
unten
Hallo,
ich bearbeite mit einer For each-Schleife selektierte Zeilen und möchte sie am Ende löschen lassen.
[code]
For Each rw In Selection.Rows
intRow = rw.Row
...Verarbeitung...
.Range("A" & intRow).EntireRow.Delete
Next rw
[/code]
Leider klappt das nicht so richtig, weil das Löschen die Selektierung verschiebt. Wie kann ich die selektierten Zeilen von unten durchlaufen?
Eine For-Schleife möchte ich ungern nehmen, da ich mehrere tausend Zeilen habe und immer nur ca. 5 markiert werden.
Gruß Uppe
Anzeige
AW: For each-Schleife von unten anfangen lassen
14.07.2011 14:53:59
unten
Hallo,
der Ansatz wäre
For I = Range("a65536").End(xlUp).Row To 1 Step -1
...
Next I
Gruß
Frederik
AW: For each-Schleife von unten anfangen lassen
14.07.2011 14:59:34
unten
Hallo Frederik,
das ist mir schon klar, aber so wollte ich es möglichst nicht machen. Zeit ist ja bekanntlich Geld.
Ich habe es im Moment so gelöst, dass ich "vorwärts" ein Feld mit den Zeilennummern fülle, welches ich dann "rückwärts" abarbeite.
i = 0
For Each rw In Selection.Rows
ReDim Preserve arrZeilen(0 To Selection.Rows.Count)
arrZeilen(i) = rw.Row
i = i + 1
Next rw
For i = Selection.Rows.Count To 0 Step -1
intRow = arrZeilen(i)
...Verarbeitung...
.Range("A" & intRow).EntireRow.Delete
Next i
Hat evtl. noch jemand eine bessere Idee?
Gruß Uppe
Anzeige
mal nachgefragt!
14.07.2011 15:01:48
Matthias
Hallo
Warum bearbeitest Du die Zeilen denn erst, wenn Du sie dann sowieso löschst ?
Selection.Rows.Delete
Gruß Matthias
AW: mal nachgefragt!
14.07.2011 15:20:08
Uppe
Hallo Matthias,
ich bearbeite nicht die Zeilen, sondern verwende die Informationen in den Zeilen.
In den Zeilen stehen Dateinamen und Informationen zu den Dateien. Je nach Datei werden unterschiedliche Verarbeitungen angestoßen und wenn diese fertig sind, soll die Zeile gelöscht werden.
Gruß Uppe
Anzeige
und Selection.Rows.Delete ?
14.07.2011 15:42:40
Matthias
Hallo
Selection.Rows einfach erst nach Deiner Verarbeitung löschen, geht nicht?
Gruß Matthias
AW: und Selection.Rows.Delete ?
14.07.2011 19:54:29
Uppe
Hallo Matthias,
das ist natürlich eine Idee! Werde ich Dienstag im Büro testen.
Gruß Uppe
AW: For each-Schleife von unten anfangen lassen
14.07.2011 19:27:55
unten
Hi,
was meinst du zu diesen beiden Möglichkeiten?

Sub xxyyzz1()
Dim lngS As Long, lngE As Long, lngZ As Long
lngS = Selection.Row                   ' 1. Zeile
lngE = lngS + Selection.Rows.Count - 1 ' letzte Zeile
With ActiveSheet
For lngZ = lngE To lngS Step -1        ' alle rückwärts
' Verarbeitung Daten der Zeile Nr. lngZ
.Rows(lngZ).Delete                  ' lösche
Next lngZ
End With
End Sub
Sub xxyyzz2()
Dim rngR As Range, lngZ As Long, rngDel As Range
With ActiveSheet
For Each rngR In Selection.Rows     ' alle vorwärts
lngZ = rngR.Row
' Verarbeitung Daten der Zeile rngR (Nr. lngZ)
If rngDel Is Nothing Then
Set rngDel = .Rows(lngZ)      ' Löschen vormerken
Else
Set rngDel = Union(rngDel, .Rows(lngZ))
End If
Next rngR
'                                   ' Löschen in 1 Rutsch
If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Schleife und Löschen von Zeilen
14.07.2011 19:53:47
Zeilen
Hi,
die zweite Routine kann man einfacher und kürzer schreiben:

Sub xxyyzz2n()
Dim rngR As Range, rngDel As Range
With ActiveSheet
For Each rngR In Selection.Rows     ' alle vorwärts
' Verarbeitung Daten der Zeile rngR
If rngDel Is Nothing Then
Set rngDel = rngR             ' Löschen vormerken
Else
Set rngDel = Union(rngDel, rngR)
End If
Next rngR
'                                   ' Löschen in 1 Rutsch
If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Schleife und Löschen von Zeilen
14.07.2011 19:58:16
Zeilen
Hallo Erich,
ich werde am Dienstag im Büro mal die zweite Variante testen.
Bei der ersten Variante wird ja vorausgesetzt, dass zwischen den selektierten Zeilen keine nichtselektierten sind.
Gruß Uppe
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

For each-Schleife von unten anfangen lassen


Schritt-für-Schritt-Anleitung

Um eine For each-Schleife in Excel VBA so zu gestalten, dass sie von unten nach oben durch die selektierten Zeilen läuft, kannst du folgende Schritte befolgen:

  1. Selektiere die gewünschten Zeilen in deinem Excel-Dokument.

  2. Öffne den VBA-Editor (Alt + F11).

  3. Füge den folgenden Code in ein neues Modul ein:

    Sub DeleteSelectedRows()
       Dim rngR As Range, rngDel As Range
       With ActiveSheet
           For Each rngR In Selection.Rows ' alle vorwärts
               ' Verarbeitung Daten der Zeile rngR
               If rngDel Is Nothing Then
                   Set rngDel = rngR ' Löschen vormerken
               Else
                   Set rngDel = Union(rngDel, rngR)
               End If
           Next rngR
           ' Löschen in 1 Rutsch
           If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
       End With
    End Sub
  4. Führe das Makro aus, um die selektierten Zeilen nach der gewünschten Verarbeitung zu löschen.


Häufige Fehler und Lösungen

  1. Problem: Zeilen werden nicht korrekt gelöscht.

    • Lösung: Stelle sicher, dass der Bereich korrekt definiert ist und keine nicht selektierten Zeilen zwischen den selektierten Zeilen stehen.
  2. Problem: Der Code läuft nicht.

    • Lösung: Überprüfe, ob die Auswahl tatsächlich Zeilen umfasst und dass du im richtigen Arbeitsblatt arbeitest.

Alternative Methoden

Falls du die For each-Schleife nicht verwenden möchtest, kannst du auch die For Schleife rückwärts nutzen. Hier ist ein Beispiel:

Sub DeleteRowsReverse()
    Dim i As Long
    For i = Selection.Rows.Count To 1 Step -1
        ' Verarbeitung für die Zeile i
        Selection.Rows(i).Delete
    Next i
End Sub

Diese Methode durchläuft die selektierten Zeilen von unten nach oben und verhindert dabei, dass sich die Auswahl während des Löschvorgangs verschiebt.


Praktische Beispiele

Hier sind zwei praktische Beispiele, die zeigen, wie du die For each-Schleife anpassen kannst:

  1. Bearbeiten und Löschen von selektierten Zeilen:

    Sub ProcessAndDeleteRows()
       Dim rngR As Range, rngDel As Range
       With ActiveSheet
           For Each rngR In Selection.Rows
               ' Verarbeitung der Daten in rngR
               If rngDel Is Nothing Then
                   Set rngDel = rngR
               Else
                   Set rngDel = Union(rngDel, rngR)
               End If
           Next rngR
           If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
       End With
    End Sub
  2. Löschen von Zeilen in einer For Schleife rückwärts:

    Sub DeleteRowsBackward()
       Dim i As Long
       For i = Selection.Rows.Count To 1 Step -1
           ' Verarbeitung für die Zeile i
           Selection.Rows(i).Delete
       Next i
    End Sub

Tipps für Profis

  • Verwende Union, um mehrere Zeilen auf einmal zu löschen, was die Effizienz erhöht.
  • Teste den Code in einer Kopie deiner Datei, um Datenverluste zu vermeiden.
  • Nutze die For each Schleife vba für einfachere und lesbarere Codes bei der Bearbeitung von großen Datenmengen.

FAQ: Häufige Fragen

1. Wie kann ich die For each-Schleife anpassen, um nur bestimmte Zeilen zu bearbeiten? Du kannst Bedingungen innerhalb der Schleife verwenden, um nur die gewünschten Zeilen zu bearbeiten.

2. Ist es möglich, die For each-Schleife zu kombinieren mit anderen Schleifen? Ja, du kannst sowohl For each als auch For Schleife rückwärts in einem einzigen Makro verwenden, um komplexere Aufgaben zu erledigen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige