For-Schleifen: Unterschied zwischen den Versionen

Aus VBA-wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „== Einfache For-Schleife == Sub ForNext() Dim strCharacter As String <span style="Color:green">' Voraussetzung: Dem Entwickler oder dem angesprochenen Objekt…“)
 
Keine Bearbeitungszusammenfassung
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Category:vba-wiki]]
== Einfache For-Schleife ==
== Einfache For-Schleife ==


Sub ForNext() Dim strCharacter As String <span style="Color:green">' Voraussetzung: Dem Entwickler oder dem angesprochenen Objekt ' ist die Anzahl der Elemente bekannt ' Grundgerüst: Zähler (bitte auf Größe achten!!!)</span> Dim lngIndex As Long <span style="Color:green">' Grundgerüst: ' For Zähler = Anfang To Ende ' Code ' Next Zähler ' Vom Entwickler vorgegebene Anfangs- und Endwerte</span> For lngIndex = 3 To 17 Debug.Print lngIndex Next lngIndex <span style="Color:green">' Die Eigenschaft 'Count' einer Auflistung enthält die Anzahl der Elemente</span> For lngIndex = 1 To ActiveDocument.Characters.Count strCharacter = ActiveDocument.Characters.Item(lngIndex) Debug.Print strCharacter Next lngIndex End Sub
Sub ForNext()
    Dim strCharacter As String
   
    <span style="Color:green">' Voraussetzung: Dem Entwickler oder dem angesprochenen Objekt
    ' ist die Anzahl der Elemente bekannt
   
    ' Grundgerüst: Zähler (bitte auf Größe achten!!!)</span>
    Dim lngIndex As Long
   
    <span style="Color:green">' Grundgerüst:  
    ' For Zähler = Anfang To Ende
        ' Code
    ' Next Zähler
   
   
    ' Vom Entwickler vorgegebene Anfangs- und Endwerte</span>
    For lngIndex = 3 To 17
        Debug.Print lngIndex
    Next lngIndex
   
   
    <span style="Color:green">' Die Eigenschaft 'Count' einer Auflistung enthält die Anzahl der Elemente</span>
    For lngIndex = 1 To ActiveDocument.Characters.Count
        strCharacter = ActiveDocument.Characters.Item(lngIndex)
        Debug.Print strCharacter
    Next lngIndex
   
End Sub


=== Verhalten in verschiedenen Situationen ===
=== Verhalten in verschiedenen Situationen ===


Standardsituation: <span style="Color:blue"> For </span>lngIndex <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">3</span> Debug<span style="Color:gray">.</span>Print lngIndex <span style="Color:green">' 1, 2, 3</span> <span style="Color:blue"> Next </span>lngIndex Debug<span style="Color:gray">.</span>Print lngIndex <span style="Color:green">' 4</span> Anfangs- und Endwert sind gleich: Wird trotzdem einmal durchlaufen <span style="Color:blue"> For </span>lngIndex <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">1</span> Debug<span style="Color:gray">.</span>Print lngIndex <span style="Color:green">' 1</span> <span style="Color:blue"> Next </span>lngIndex Debug<span style="Color:gray">.</span>Print lngIndex <span style="Color:green">' 2</span> Anfangswert ist geringer als Endwert: Schleife wird nicht betreten! <span style="Color:blue"> For </span>lngIndex <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">0</span> Debug<span style="Color:gray">.</span>Print lngIndex <span style="Color:green">' Schleife wird nicht betreten</span> <span style="Color:blue"> Next </span>lngIndex Debug<span style="Color:gray">.</span>Print lngIndex <span style="Color:green">' 1</span>
Standardsituation:  
 
  <span style="Color:blue"> For </span>lngIndex <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">3</span>
        Debug<span style="Color:gray">.</span>Print lngIndex       <span style="Color:green">' 1, 2, 3</span>
  <span style="Color:blue"> Next </span>lngIndex
    Debug<span style="Color:gray">.</span>Print lngIndex           <span style="Color:green">' 4</span>
 
Anfangs- und Endwert sind gleich: Wird trotzdem einmal durchlaufen
 
  <span style="Color:blue"> For </span>lngIndex <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">1</span>
        Debug<span style="Color:gray">.</span>Print lngIndex       <span style="Color:green">' 1</span>
  <span style="Color:blue"> Next </span>lngIndex
    Debug<span style="Color:gray">.</span>Print lngIndex           <span style="Color:green">' 2</span>
 
Anfangswert ist geringer als Endwert: Schleife wird nicht betreten!
 
  <span style="Color:blue"> For </span>lngIndex <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">0</span>
        Debug<span style="Color:gray">.</span>Print lngIndex       <span style="Color:green">' Schleife wird nicht betreten</span>
  <span style="Color:blue"> Next </span>lngIndex
    Debug<span style="Color:gray">.</span>Print lngIndex           <span style="Color:green">' 1</span>


== Step ==
== Step ==


Mit dem zusätzlichen Schlüsselwort 'Step' können wie in diesem Beispiel Elemente übersprungen werden: Sub ForNextStep() <span style="Color:green">' Beispiel: Tabellenzeilen abwechselnd färben</span> Dim lngRow As Long Dim tblTable As Table <span style="Color:green">' Table ist ein Objekt und wird mit 'Set' zugewiesen</span> Set tblTable = Selection.Tables.Item(1) <span style="Color:green">' Mit 'Step 2' wird bei 'Next' dem Zähler 2 hinzugezählt</span> For lngRow = 1 To tblTable.Rows.Count Step 2 tblTable.Rows.Item(lngRow).Shading.BackgroundPatternColor = -721354855 Next lngRow End Sub
Mit dem zusätzlichen Schlüsselwort 'Step' können wie in diesem Beispiel Elemente übersprungen werden:
 
Sub ForNextStep()
    <span style="Color:green">' Beispiel: Tabellenzeilen abwechselnd färben</span>
    Dim lngRow As Long
    Dim tblTable As Table
   
    <span style="Color:green">' Table ist ein Objekt und wird mit 'Set' zugewiesen</span>
    Set tblTable = Selection.Tables.Item(1)
   
    <span style="Color:green">' Mit 'Step 2' wird bei 'Next' dem Zähler 2 hinzugezählt</span>
    For lngRow = 1 To tblTable.Rows.Count Step 2
        tblTable.Rows.Item(lngRow).Shading.BackgroundPatternColor = -721354855
    Next lngRow
End Sub


== Step -1 ==
== Step -1 ==


Die Rückwärts-Schleife wird zum Löschen einzelner Elemente aus einer Auflistung verwendet: <span style="Color:blue"> Sub </span>ForNextStepMinus<span style="Color:gray">1()</span> <span style="Color:blue"> Dim </span>lngRow<span style="Color:blue"> As Long</span> <span style="Color:blue"> Dim </span>tblTable<span style="Color:blue"> As </span>Table <span style="Color:green">' Die Word-Tabelle ist ein Objekt und wird mit 'Set' zugewiesen</span></span> <span style="Color:blue"> Set </span>tblTable <span style="Color:gray">=</span> Selection<span style="Color:gray">.</span>Tables<span style="Color:gray">.</span>Item<span style="Color:gray">(1)</span> <span style="Color:green">' Mit 'Step -1' wird bei 'Next' die nächst obere Zeile verwendet</span> <span style="Color:green">' Dies ist beim Löschen von Elementen aus einer Liste der einzig verwendbare Weg</span> <span style="Color:green">' Hierbei den Anfangs- und Endpunkt vertauschen,</span> <span style="Color:green">' also: For Zähler = Endpunkt To Anfangspunkt Step -1</span></span> <span style="Color:blue"> For </span>lngRow <span style="Color:gray">=</span> tblTable<span style="Color:gray">.</span>Rows<span style="Color:gray">.</span>Count<span style="Color:blue"> To </span><span style="Color:gray">1</span> Step <span style="Color:gray">-1</span> tblTable<span style="Color:gray">.</span>Rows<span style="Color:gray">.</span>Item<span style="Color:gray">(</span>lngRow<span style="Color:gray">).</span>Delete <span style="Color:blue"> Next </span>lngRow <span style="Color:blue"> End Sub</span>
Die Rückwärts-Schleife wird zum Löschen einzelner Elemente aus einer Auflistung verwendet:
 
<span style="Color:blue"> Sub </span>ForNextStepMinus<span style="Color:gray">1()</span>
   
  <span style="Color:blue"> Dim </span>lngRow<span style="Color:blue"> As Long</span>
  <span style="Color:blue"> Dim </span>tblTable<span style="Color:blue"> As </span>Table
   
  <span style="Color:green">' Die Word-Tabelle ist ein Objekt und wird mit 'Set' zugewiesen</span></span>
  <span style="Color:blue"> Set </span>tblTable <span style="Color:gray">=</span> Selection<span style="Color:gray">.</span>Tables<span style="Color:gray">.</span>Item<span style="Color:gray">(1)</span>
   
    <span style="Color:green">' Mit 'Step -1' wird bei 'Next' die nächst obere Zeile verwendet</span>
    <span style="Color:green">' Dies ist beim Löschen von Elementen aus einer Liste der einzig verwendbare Weg</span>
    <span style="Color:green">' Hierbei den Anfangs- und Endpunkt vertauschen,</span>
    <span style="Color:green">' also: For Zähler = Endpunkt To Anfangspunkt Step -1</span></span>
   
  <span style="Color:blue"> For </span>lngRow <span style="Color:gray">=</span> tblTable<span style="Color:gray">.</span>Rows<span style="Color:gray">.</span>Count<span style="Color:blue"> To </span><span style="Color:gray">1</span> Step <span style="Color:gray">-1</span>
        tblTable<span style="Color:gray">.</span>Rows<span style="Color:gray">.</span>Item<span style="Color:gray">(</span>lngRow<span style="Color:gray">).</span>Delete
  <span style="Color:blue"> Next </span>lngRow
<span style="Color:blue"> End Sub</span>


== Step 0.1 ==
== Step 0.1 ==


Auf diesem Wege ist es möglich, in nicht Ganzzahligen Schritten durch die Schleife zu schreiten: <span style="Color:blue"> Sub </span>StepOneTenth<span style="Color:gray">()</span> <span style="Color:blue"> Dim </span>dblIndex<span style="Color:blue"> As Double</span> <span style="Color:blue"> For </span>dblIndex <span style="Color:gray">=</span> <span style="Color:gray">0.3</span><span style="Color:blue"> To </span><span style="Color:gray">1.2</span> Step <span style="Color:gray">0.1</span> Debug<span style="Color:gray">.</span>Print dblIndex <span style="Color:blue"> Next </span>dblIndex <span style="Color:blue"> End Sub</span>
Auf diesem Wege ist es möglich, in nicht Ganzzahligen Schritten durch die Schleife zu schreiten:
 
<span style="Color:blue"> Sub </span>StepOneTenth<span style="Color:gray">()</span>
    <span style="Color:blue"> Dim </span>dblIndex<span style="Color:blue"> As Double</span>
   
    <span style="Color:blue"> For </span>dblIndex <span style="Color:gray">=</span> <span style="Color:gray">0.3</span><span style="Color:blue"> To </span><span style="Color:gray">1.2</span> Step <span style="Color:gray">0.1</span>
        Debug<span style="Color:gray">.</span>Print dblIndex
    <span style="Color:blue"> Next </span>dblIndex
<span style="Color:blue"> End Sub</span>


== For Each ==
== For Each ==


Mit dem Schlüsselwort 'Each' erübrigt sich die Verwendung einer Laufvariablen. Stattdessen wird das einzelne Element der Auflistung direkt angesprochen. Voraussetzung hierfür ist, dass eine entsprechende Variable vorbereitet wurde, um das Element entgegenzunehmen. Hinter dem Schlüsselwort 'In' erscheint dann die Auflistung, aus welcher die Elemente stammen. '''Bitte beachten:''' Eine 'For Each'-Schleife kann nur bei Auflistungen angewendet werden, die '''Objekte''' enthalten! Private Sub ForEach() Dim lngIndex As Long Dim rowTable As Row Dim tbl As Table Set tbl = ActiveDocument.Tables.Item(1) For Each rowTable In tbl.Rows Debug.Print rowTable.Cells(1).Range.Text <span style="Color:green">' Laufvariable muss bei For Each ein Variant bzw. ein Objekt sein!</span> Next rowTable <span style="Color:green">' Als reguläre For-Schleife:</span> For lngIndex = 1 To tbl.Rows.Count Set rowTable = tbl.Rows.Item(lngIndex) Debug.Print rowTable.Cells(1).Range.Text Next lngIndex End Sub '''Bitte beachten:''' Wenn die Bearbeitung der Elemente in einer bestimmten Reihenfolge erfolgen soll, welche dem Index entspricht, verwenden Sie besser die einfache For-Schleife.
Mit dem Schlüsselwort 'Each' erübrigt sich die Verwendung einer Laufvariablen. Stattdessen wird das einzelne Element der Auflistung direkt angesprochen. Voraussetzung hierfür ist, dass eine entsprechende Variable vorbereitet wurde, um das Element entgegenzunehmen.
 
Hinter dem Schlüsselwort 'In' erscheint dann die Auflistung, aus welcher die Elemente stammen.
 
'''Bitte beachten:''' Eine 'For Each'-Schleife kann nur bei Auflistungen angewendet werden, die '''Objekte''' enthalten! Bei der VBA-Collection kann sie daher nicht verwendet werden, denn die einzelnen Elemente werden als Variant gespeichert (welche zwar ebenfalls Objekte enthalten können, jedoch keine Objekte sind :-/).
 
Private Sub ForEach()
    Dim lngIndex As Long
    Dim rowTable As Row
    Dim tbl As Table
   
    Set tbl = ActiveDocument.Tables.Item(1)
   
    For Each rowTable In tbl.Rows
        Debug.Print rowTable.Cells(1).Range.Text     <span style="Color:green">' Laufvariable muss bei For Each ein Variant bzw. ein Objekt sein!</span>
    Next rowTable
   
    <span style="Color:green">' Als reguläre For-Schleife:</span>
   
    For lngIndex = 1 To tbl.Rows.Count
        Set rowTable = tbl.Rows.Item(lngIndex)
        Debug.Print rowTable.Cells(1).Range.Text
    Next lngIndex
End Sub
 
'''Bitte beachten:''' Wenn die Bearbeitung der Elemente in einer bestimmten Reihenfolge erfolgen soll, welche dem Index entspricht, verwenden Sie besser die einfache For-Schleife.


== Elemente löschen: 'For Each' vs. 'Step -1' ==
== Elemente löschen: 'For Each' vs. 'Step -1' ==


Die 'For Each'-Schleife kann in vielen Situationen ebenso gut wie die 'Step -1'-Schleife eingesetzt werden, um Elemente aus einer Auflistung zu löschen. Je nach Auflistung, auf die zugegriffen wird, kann sich die 'For Each'-Schleife jedoch als unzureichend erweisen. Wenn Sie zum Beispiel einzelne Arbeitsblätter einer Arbeitsmappe löschen, passt sich die 'For Each'-Schleife insofern an, dass keine Elemente ausgelassen werden, wie es bei der regulären 'For Next'-Schleife durchaus passieren kann. In diesem folgenden Fall jedoch verhält sich die 'For Each'-Schliefe genau wie die 'For Next'-Schleife und ist somit unzureichend: <span style="Color:blue"> Sub </span>DeleteRowsMarkedX<span style="Color:gray">()</span> <span style="Color:blue"> Dim </span>rngCell<span style="Color:blue"> As </span>Range <span style="Color:green">' Beispiel: Excel Zeilen bedingt löschen</span> <span style="Color:green">' For Each löscht keine aufeinander folgenden Zeilen,</span> <span style="Color:green">' zweiter Treffer wird übersprungen</span></span> <span style="Color:blue"> For Each </span>rngCell In Range<span style="Color:gray">("A1:A10")</span> <span style="Color:blue"> If </span>rngCell<span style="Color:gray">.</span>Text <span style="Color:gray">=</span> <span style="Color:gray">"x"</span><span style="Color:blue"> Then </span>rngCell<span style="Color:gray">.</span>EntireRow<span style="Color:gray">.</span>Delete <span style="Color:blue"> Next </span>rngCell <span style="Color:blue"> End Sub</span> In diesem Beispiel sollen die Zeilen, die in der ersten Spalte mit einem 'x' gekennzeichnet sind, komplett gelöscht werden. Die 'For Each'-Schleife durchläuft die Zeilen einer Tabelle wie eine reguläre For-Schleife und überspringt somit Zeilen, wenn vorangegangene Zeilen gelöscht wurden: Wenn in der ersten Spalte a, x, b, c, x, d, x, e, f, g eingetragen war, wird die Liste korrekt auf a, b, c, d, e, f, g gekürzt. Wenn jedoch a, x, x, b, c, x, x, d, x, e eingetragen wurde, bleibt a, x, b, c, x, d, e übrig. Die Rückwärts-Schleife kann dagegen immer jedes Element einer Auflistung betrachten, weil gelöschte Elemente 'hinter' ihr liegen. Sie wird daher auf jeden Fall korrekte Ergebnisse erzielen: <span style="Color:blue"> Sub </span>DeleteRowsMarkedX<span style="Color:gray">()</span> <span style="Color:blue"> Dim </span>rngCell<span style="Color:blue"> As </span>Range <span style="Color:blue"> Dim </span>lngIndex<span style="Color:blue"> As Long</span> <span style="Color:blue"> For </span>lngIndex <span style="Color:gray">=</span> Range<span style="Color:gray">("A1:A10").</span>Rows<span style="Color:gray">.</span>Count<span style="Color:blue"> To </span><span style="Color:gray">1</span> Step <span style="Color:gray">-1</span> <span style="Color:blue"> Set </span>rngCell <span style="Color:gray">=</span> Range<span style="Color:gray">("A1:A10").</span>Cells<span style="Color:gray">(</span>lngIndex<span style="Color:gray">)</span> <span style="Color:blue"> If </span>rngCell<span style="Color:gray">.</span>Text <span style="Color:gray">=</span> <span style="Color:gray">"x"</span><span style="Color:blue"> Then </span>rngCell<span style="Color:gray">.</span>EntireRow<span style="Color:gray">.</span>Delete <span style="Color:blue"> Next </span>lngIndex <span style="Color:blue"> End Sub</span>
Die 'For Each'-Schleife kann in vielen Situationen ebenso gut wie die 'Step -1'-Schleife eingesetzt werden, um Elemente aus einer Auflistung zu löschen.
 
Je nach Auflistung, auf die zugegriffen wird, kann sich die 'For Each'-Schleife jedoch als unzureichend erweisen. Wenn Sie zum Beispiel einzelne Arbeitsblätter einer Arbeitsmappe löschen, passt sich die 'For Each'-Schleife insofern an, dass keine Elemente ausgelassen werden, wie es bei der regulären 'For Next'-Schleife durchaus passieren kann.
 
In diesem folgenden Fall jedoch verhält sich die 'For Each'-Schliefe genau wie die 'For Next'-Schleife und ist somit unzureichend:  
 
  <span style="Color:blue"> Sub </span>DeleteRowsMarkedX<span style="Color:gray">()</span>
      <span style="Color:blue"> Dim </span>rngCell<span style="Color:blue"> As </span>Range
       
        <span style="Color:green">' Beispiel: Excel Zeilen bedingt löschen</span>
        <span style="Color:green">' For Each löscht keine aufeinander folgenden Zeilen,</span>
        <span style="Color:green">' zweiter Treffer wird übersprungen</span></span>
      <span style="Color:blue"> For Each </span>rngCell In Range<span style="Color:gray">("A1:A10")</span>
          <span style="Color:blue"> If </span>rngCell<span style="Color:gray">.</span>Text <span style="Color:gray">=</span> <span style="Color:gray">"x"</span><span style="Color:blue"> Then </span>rngCell<span style="Color:gray">.</span>EntireRow<span style="Color:gray">.</span>Delete
      <span style="Color:blue"> Next </span>rngCell
  <span style="Color:blue"> End Sub</span>
 
In diesem Beispiel sollen die Zeilen, die in der ersten Spalte mit einem 'x' gekennzeichnet sind, komplett gelöscht werden. Die 'For Each'-Schleife durchläuft die Zeilen einer Tabelle wie eine reguläre For-Schleife und überspringt somit Zeilen, wenn vorangegangene Zeilen gelöscht wurden:
 
Wenn in der ersten Spalte a, x, b, c, x, d, x, e, f, g eingetragen war, wird die Liste korrekt auf a, b, c, d, e, f, g gekürzt. Wenn jedoch a, x, x, b, c, x, x, d, x, e eingetragen wurde, bleibt a, x, b, c, x, d, e übrig.
 
Die Rückwärts-Schleife kann dagegen immer jedes Element einer Auflistung betrachten, weil gelöschte Elemente 'hinter' ihr liegen. Sie wird daher auf jeden Fall korrekte Ergebnisse erzielen:
 
  <span style="Color:blue"> Sub </span>DeleteRowsMarkedX<span style="Color:gray">()</span>
      <span style="Color:blue"> Dim </span>rngCell<span style="Color:blue"> As </span>Range
      <span style="Color:blue"> Dim </span>lngIndex<span style="Color:blue"> As Long</span>
       
      <span style="Color:blue"> For </span>lngIndex <span style="Color:gray">=</span> Range<span style="Color:gray">("A1:A10").</span>Rows<span style="Color:gray">.</span>Count<span style="Color:blue"> To </span><span style="Color:gray">1</span> Step <span style="Color:gray">-1</span>
          <span style="Color:blue"> Set </span>rngCell <span style="Color:gray">=</span> Range<span style="Color:gray">("A1:A10").</span>Cells<span style="Color:gray">(</span>lngIndex<span style="Color:gray">)</span>
          <span style="Color:blue"> If </span>rngCell<span style="Color:gray">.</span>Text <span style="Color:gray">=</span> <span style="Color:gray">"x"</span><span style="Color:blue"> Then </span>rngCell<span style="Color:gray">.</span>EntireRow<span style="Color:gray">.</span>Delete
      <span style="Color:blue"> Next </span>lngIndex
  <span style="Color:blue"> End Sub</span>

Aktuelle Version vom 28. Januar 2023, 00:38 Uhr

Einfache For-Schleife

Sub ForNext()
   Dim strCharacter As String
   
   ' Voraussetzung: Dem Entwickler oder dem angesprochenen Objekt
   ' ist die Anzahl der Elemente bekannt
   
   ' Grundgerüst: Zähler (bitte auf Größe achten!!!)
   Dim lngIndex As Long
   
   ' Grundgerüst: 
   ' For Zähler = Anfang To Ende
       ' Code
   ' Next Zähler
   
   
   ' Vom Entwickler vorgegebene Anfangs- und Endwerte
   For lngIndex = 3 To 17
       Debug.Print lngIndex
   Next lngIndex
   
   
   ' Die Eigenschaft 'Count' einer Auflistung enthält die Anzahl der Elemente
   For lngIndex = 1 To ActiveDocument.Characters.Count
       strCharacter = ActiveDocument.Characters.Item(lngIndex)
       Debug.Print strCharacter
   Next lngIndex
   
End Sub

Verhalten in verschiedenen Situationen

Standardsituation:

   For lngIndex = 1 To 3
       Debug.Print lngIndex        ' 1, 2, 3
   Next lngIndex
   Debug.Print lngIndex            ' 4

Anfangs- und Endwert sind gleich: Wird trotzdem einmal durchlaufen

   For lngIndex = 1 To 1
       Debug.Print lngIndex        ' 1
   Next lngIndex
   Debug.Print lngIndex            ' 2

Anfangswert ist geringer als Endwert: Schleife wird nicht betreten!

   For lngIndex = 1 To 0
       Debug.Print lngIndex        ' Schleife wird nicht betreten
   Next lngIndex
   Debug.Print lngIndex            ' 1

Step

Mit dem zusätzlichen Schlüsselwort 'Step' können wie in diesem Beispiel Elemente übersprungen werden:

Sub ForNextStep()

   ' Beispiel: Tabellenzeilen abwechselnd färben
   Dim lngRow As Long
   Dim tblTable As Table
   
   ' Table ist ein Objekt und wird mit 'Set' zugewiesen
   Set tblTable = Selection.Tables.Item(1)
   
   ' Mit 'Step 2' wird bei 'Next' dem Zähler 2 hinzugezählt

   For lngRow = 1 To tblTable.Rows.Count Step 2
       tblTable.Rows.Item(lngRow).Shading.BackgroundPatternColor = -721354855
   Next lngRow
End Sub

Step -1

Die Rückwärts-Schleife wird zum Löschen einzelner Elemente aus einer Auflistung verwendet:

 Sub ForNextStepMinus1()
   
   Dim lngRow As Long
   Dim tblTable As Table
   
  ' Die Word-Tabelle ist ein Objekt und wird mit 'Set' zugewiesen
   Set tblTable = Selection.Tables.Item(1)
   
   ' Mit 'Step -1' wird bei 'Next' die nächst obere Zeile verwendet
   ' Dies ist beim Löschen von Elementen aus einer Liste der einzig verwendbare Weg
   ' Hierbei den Anfangs- und Endpunkt vertauschen,
   ' also: For Zähler = Endpunkt To Anfangspunkt Step -1
   
   For lngRow = tblTable.Rows.Count To 1 Step -1
       tblTable.Rows.Item(lngRow).Delete
   Next lngRow
 End Sub

Step 0.1

Auf diesem Wege ist es möglich, in nicht Ganzzahligen Schritten durch die Schleife zu schreiten:

 Sub StepOneTenth()
    Dim dblIndex As Double
    
    For dblIndex = 0.3 To 1.2 Step 0.1
        Debug.Print dblIndex
    Next dblIndex
 End Sub

For Each

Mit dem Schlüsselwort 'Each' erübrigt sich die Verwendung einer Laufvariablen. Stattdessen wird das einzelne Element der Auflistung direkt angesprochen. Voraussetzung hierfür ist, dass eine entsprechende Variable vorbereitet wurde, um das Element entgegenzunehmen.

Hinter dem Schlüsselwort 'In' erscheint dann die Auflistung, aus welcher die Elemente stammen.

Bitte beachten: Eine 'For Each'-Schleife kann nur bei Auflistungen angewendet werden, die Objekte enthalten! Bei der VBA-Collection kann sie daher nicht verwendet werden, denn die einzelnen Elemente werden als Variant gespeichert (welche zwar ebenfalls Objekte enthalten können, jedoch keine Objekte sind :-/).

Private Sub ForEach()
   Dim lngIndex As Long
   Dim rowTable As Row
   Dim tbl As Table
   
   Set tbl = ActiveDocument.Tables.Item(1)
   
   For Each rowTable In tbl.Rows
       Debug.Print rowTable.Cells(1).Range.Text     ' Laufvariable muss bei For Each ein Variant bzw. ein Objekt sein!
   Next rowTable
   
   ' Als reguläre For-Schleife:
   
   For lngIndex = 1 To tbl.Rows.Count
       Set rowTable = tbl.Rows.Item(lngIndex)
       Debug.Print rowTable.Cells(1).Range.Text
   Next lngIndex
End Sub

Bitte beachten: Wenn die Bearbeitung der Elemente in einer bestimmten Reihenfolge erfolgen soll, welche dem Index entspricht, verwenden Sie besser die einfache For-Schleife.

Elemente löschen: 'For Each' vs. 'Step -1'

Die 'For Each'-Schleife kann in vielen Situationen ebenso gut wie die 'Step -1'-Schleife eingesetzt werden, um Elemente aus einer Auflistung zu löschen.

Je nach Auflistung, auf die zugegriffen wird, kann sich die 'For Each'-Schleife jedoch als unzureichend erweisen. Wenn Sie zum Beispiel einzelne Arbeitsblätter einer Arbeitsmappe löschen, passt sich die 'For Each'-Schleife insofern an, dass keine Elemente ausgelassen werden, wie es bei der regulären 'For Next'-Schleife durchaus passieren kann.

In diesem folgenden Fall jedoch verhält sich die 'For Each'-Schliefe genau wie die 'For Next'-Schleife und ist somit unzureichend:

   Sub DeleteRowsMarkedX()
       Dim rngCell As Range
       
       ' Beispiel: Excel Zeilen bedingt löschen
       ' For Each löscht keine aufeinander folgenden Zeilen,
       ' zweiter Treffer wird übersprungen
       For Each rngCell In Range("A1:A10")
           If rngCell.Text = "x" Then rngCell.EntireRow.Delete
       Next rngCell
   End Sub

In diesem Beispiel sollen die Zeilen, die in der ersten Spalte mit einem 'x' gekennzeichnet sind, komplett gelöscht werden. Die 'For Each'-Schleife durchläuft die Zeilen einer Tabelle wie eine reguläre For-Schleife und überspringt somit Zeilen, wenn vorangegangene Zeilen gelöscht wurden:

Wenn in der ersten Spalte a, x, b, c, x, d, x, e, f, g eingetragen war, wird die Liste korrekt auf a, b, c, d, e, f, g gekürzt. Wenn jedoch a, x, x, b, c, x, x, d, x, e eingetragen wurde, bleibt a, x, b, c, x, d, e übrig.

Die Rückwärts-Schleife kann dagegen immer jedes Element einer Auflistung betrachten, weil gelöschte Elemente 'hinter' ihr liegen. Sie wird daher auf jeden Fall korrekte Ergebnisse erzielen:

   Sub DeleteRowsMarkedX()
       Dim rngCell As Range
       Dim lngIndex As Long
       
       For lngIndex = Range("A1:A10").Rows.Count To 1 Step -1
           Set rngCell = Range("A1:A10").Cells(lngIndex)
           If rngCell.Text = "x" Then rngCell.EntireRow.Delete
       Next lngIndex
   End Sub