In diesem Artikel haben wir verschiedene Arten von Schleifen behandelt, die in VBA verwendet werden, und wie sie verwendet werden, um dieselbe Aufgabe auf unterschiedliche Weise auszuführen.

Warum Loops?

Looping ist eine der leistungsstärksten Programmiertechniken, die in vielen Programmiersprachen verwendet werden. Das Schleifen wird verwendet, um einen Codeblock für die erforderliche Anzahl von Malen zu wiederholen oder bis eine bestimmte Bedingung als wahr ausgewertet wird oder ein bestimmter Wert erreicht ist, wonach der nächste Codeblock ausgeführt wird.

Der Zweck einer Excel-VBA-Schleife besteht darin, Excel dazu zu bringen, einen bestimmten Code ein bestimmtes Mal zu wiederholen. Man kann angeben, wie oft ein Code als feste Zahl (z. B. 10 Mal) oder als Variable (z. B. so oft wie Datenzeilen vorhanden sind) wiederholt werden muss.

Excel-Schleifen können auf unterschiedliche Weise erstellt werden, um den unterschiedlichen Umständen gerecht zu werden. Oft können dieselben Ergebnisse auf unterschiedliche Weise erzielt werden, um Ihren persönlichen Vorlieben zu entsprechen.

In Excel VBA stehen drei verschiedene Arten von Schleifen zur Verfügung:

  1. DO BIS Loop 2. DO WHILE Loop 3. FOR Loop {leer} 1. DO UNTIL-Schleife Mit der DO UNTIL-Schleife wird ein Codeblock auf unbestimmte Zeit wiederholt, bis die angegebene Bedingung auf True gesetzt ist. Der Zustand kann entweder am Anfang oder am Ende der Schleife überprüft werden. Die Anweisung DO UNTIL… LOOP testet die Bedingung am Anfang, während die Anweisung DO… LOOP UNTIL die Bedingung am Ende der Schleife testet.

Syntax der Anweisung DO UNTIL… LOOP

Do Bis [Bedingung]

{leer} [Zu wiederholender Codeblock]

Schleife

Syntax der Anweisung DO… LOOP UNTIL

Do [Zu wiederholender Codeblock]

Schleife bis [Bedingung]

Wir haben die DO… UNTIL-Schleife anhand eines Beispiels erklärt. Die Makros Loop1 und Loop2 werden verwendet, um den Durchschnitt der Zahlen in Spalte A und Spalte B mithilfe der Schleife DO… UNTIL zu berechnen.

Probendaten liegen im Bereich A15: B27 vor. Spalte A enthält Punktzahlen von Runde 1 und Spalte B enthält Punktzahlen von Runde 2. Wir möchten Durchschnittswerte der Punktzahlen in Runde 1 und Runde 2 in Spalte C berechnen.

Sample1

Im Loop1-Makro haben wir „FormulaR1C1“ verwendet, um eine Durchschnittsformel in die aktive Zelle einzufügen. Die Bedingungsanweisung in der DO UNTIL-Schleife wird am Ende der Schleife überprüft.

Im Loop2-Makro haben wir „WorksheetFunction.Average“ verwendet, um einen Durchschnittswert in die aktive Zelle einzufügen. Auch in diesem Makro wird die Bedingungsanweisung am Ende der Schleife überprüft.

Der einzige Unterschied zwischen Loop1- und Loop2-Makro besteht darin, dass Loop1 die Durchschnittsformel einfügt, während Loop2 den Durchschnitt berechnet und dann den Durchschnittswert in die aktive Zelle einfügt.

OutputSample1

{leer} 2. DO WHILE-Schleife Die DO WHILE-Schleife wird verwendet, um einen Codeblock auf unbestimmte Zeit zu wiederholen, während die angegebene Bedingung weiterhin True ist und stoppt, wenn die Bedingung False zurückgibt. Der Zustand kann entweder am Anfang oder am Ende der Schleife überprüft werden. Die Anweisung DO WHILE… LOOP testet die Bedingung am Anfang, während die Anweisung DO… LOOP WHILE die Bedingung am Ende der Schleife testet. Die Anweisung DO… LOOP WHILE wird verwendet, wenn die Schleife den Codeblock mindestens einmal ausführen soll, bevor die Bedingung überprüft wird.

Syntax der Anweisung DO WHILE… LOOP

Do While [Bedingung]

{leer} [Zu wiederholender Codeblock]

Schleife

Syntax der Anweisung DO… LOOP WHILE

Do [Zu wiederholender Codeblock]

Schleife während [Bedingung]

In diesem Beispiel werden Loop3- und Loop4-Makros verwendet, um Durchschnittswerte für Werte in Zellen von Spalte A und Spalte B zu berechnen. Beide Makros arbeiten mit denselben Beispieldaten wie die Makros Loop1 und Loop2. Beide verwenden die Anweisung DO WHILE, um den Bereich zu durchlaufen, der die Daten enthält.

Der einzige Unterschied zwischen Loop3- und Loop4-Makros besteht darin, dass sie unterschiedliche Arten der Darstellung der Bedingungen der DO WHILE-Schleife darstellen.

Da Loop3- und Loop4-Makros dieselben Eingabedaten verwenden und sogar dieselben Funktionen wie das Loop1-Makro ausführen, entspricht die zurückgegebene Ausgabe auch der des Loop1-Makros.

{leer} 3. FOR-Schleife Die For-Schleife wird verwendet, um einen Codeblock für eine bestimmte Anzahl von Malen zu wiederholen.

Syntax der FOR-Schleife

Für count_variable = start_value To end_value {leer} [Codeblock]

Das nächste Makro count_variable Loop5 zeigt, wie die FOR-Schleife zur Berechnung des Durchschnitts verwendet wird. Es werden auch dieselben Beispieldaten verwendet, die auch von anderen Makros verwendet werden. Wir haben 15 als Startwert verwendet, da die Beispieldaten ab der 15. Zeile beginnen. Wir haben Range („A“ & Cells.Rows.Count) .End (xlUp) .Row verwendet, um die letzte Zeile mit Daten zu finden. Die FOR-Schleife wird (letzte Zelle – 15) so oft wiederholt.

Die nach dem Ausführen des Loop5-Makros zurückgegebene Ausgabe entspricht der des Loop1-Makros.

Das Loop6-Makro wird nur zur Berechnung des Durchschnitts erstellt, wenn die aktive Zelle mit der Durchschnittsfunktion leer ist, bevor das Makro ausgeführt wird.

Beispieldaten für dieses Makro liegen im Bereich E15 bis G27 vor.

Sample2

Wir haben DO… LOOP WHILE verwendet, um den definierten Bereich zu durchlaufen. Mit der IF-Anweisung wird geprüft, ob die Zelle, in die die Funktion eingefügt wird, einen Wert enthält. Dieses Makro fügt nur dann eine Durchschnittsfunktion in die Zelle ein, wenn sie leer ist.

OutputSample2

Das Loop7-Makro wird auch zur Berechnung des Durchschnitts verwendet. Es prüft auf Werte in der Hilfsspalte, bevor bewertet wird, ob eine erneute Schleife durchgeführt werden soll. Es wird auch geprüft, ob die in der Durchschnittsfunktion zu verwendende Zellreferenz leer ist.

Die für das Loop7-Makro verwendeten Beispieldaten liegen im Bereich J15: M27.

Sample3

Spalte M wird als Hilfsspalte verwendet. Dieses Makro fügt nur dann eine Durchschnittsfunktion ein, wenn eine Zelle in Spalte M nicht leer ist. Dieses Makro überprüft, ob eine Zelle leer sein sollte, bevor eine Durchschnittsfunktion in sie eingefügt wird. Es wird keine Durchschnittsfunktion eingefügt, wenn die Zelle, auf die in der Durchschnittsfunktion verwiesen wird, leer ist.

OutputSample3

Bitte folgen Sie unten für den Code

Option Explicit

Sub Loop1()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

Range("C15").Select

Do

'Assigning average function on value in cells of previous two consecutive columns

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

'Moving to cell in next row

ActiveCell.Offset(1, 0).Select

'Checking whether value in cell of previous column is empty

'Do Until loop will loop until condition statement returns True

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("A15").Select

End Sub

Sub Loop2()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

'This macro is similar to macro Loop1, only way of calculating average is different

Range("C15").Select

Do

'Worsheet.Average function is used for calculating the average

ActiveCell.Value = WorksheetFunction.Average(ActiveCell.Offset(0, -1).Value, _

ActiveCell.Offset(0, -2).Value)

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("A15").Select

End Sub

Sub Loop3()

'Calculating average

'Do While loop will run until cell in the previous column of active cell is empty

Range("C15").Select

'Checking whether value in cell of previous column is empty

'Do While loop will loop until condition statement is True

Do While IsEmpty(ActiveCell.Offset(0, -1)) = False

'Assigning average function on value in cells of previous two consecutive column

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

'Moving to cell in next row

ActiveCell.Offset(1, 0).Select

Loop

Range("A15").Select

End Sub

Sub Loop4()

'Calculating average

'Do While loop will run until cell in the previous column of active cell is empty

'This macro is similar to macro Loop3, only way of applying condition is different

Range("C15").Select

Do While Not IsEmpty(ActiveCell.Offset(0, -1))

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

ActiveCell.Offset(1, 0).Select

Loop

Range("A15").Select

End Sub

Sub Loop5()

'FOR loop repeats for a fixed number of times determined by the number of rows

Dim i, lastcell As Long

'Finding the last row containing data in column A

lastcell = Range("A" & Cells.Rows.Count).End(xlUp).Row

Range("C15").Select

'i variable is assigned value of 15 as our sample data begin from 15th row

'FOR Loop will loop x

For i = 15 To lastcell

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

ActiveCell.Offset(1, 0).Select

Next i

Range("A15").Select

End Sub

Sub Loop6()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

'It does not calculate an average if there is already something in the cell

Range("G15").Select

Do

If IsEmpty(ActiveCell) Then

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

End If

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("E15").Select

End Sub

Sub Loop7()

'Do Until loop runs as long as there is something in cell in next column

'It does not calculate an average if there is already something in the active cell

'Nor if there is no data in cells which are used within average function (to avoid #DIV/0 errors).

'Calculating average

Range("L15").Select

Do

If IsEmpty(ActiveCell) Then

If IsEmpty(ActiveCell.Offset(0, -1)) And IsEmpty(ActiveCell.Offset(0, -2)) Then

ActiveCell.Value = ""

Else

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

End If

End If

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, 1))

Range("J15").Select

End Sub

Wenn dir dieser Blog gefallen hat, teile ihn mit deinen Freunden auf Facebook und Facebook.

Wir würden gerne von Ihnen hören, lassen Sie uns wissen, wie wir unsere Arbeit verbessern und für Sie verbessern können. Schreiben Sie uns unter [email protected]