Inhaltsverzeichnis
ToggleEinführung
Kontrollstrukturen ermöglichen eine Steuerung der Reihenfolge, in der die Anweisungen in einem VBA Code abgearbeitet werden. Es gibt zwei Arten von Kontollstrukturen: Verzweigungen und Schleifen.
Verzweigungen
Die Ausführung von VBA Anweisungen kann von Bedingungen abhängig sein.
If…Then
VBA Anweisugen werden nur ausgeführt, wenn eine Bedingung erfüllt ist. Der Aufbau der Verzweiung ist wie folgt:
If Bedingung Then
Anweisungen, die ausgeführt werden, wenn die Bedingung erfüllt bzw. wahr (engl. true) ist.
End If
Beispiel:
Sub If_Then()
Dim iZahl As Integer
' Initialisierung
iZahl = 5
' Verzweigung
If iZahl = 1 Then
Debug.Print "Die Zahl ist 1."
End If
End Sub
If…Then…Else-Verzweigung
Je nachdem, ob die Bedingung erfüllt ist oder nicht, soll das Programm „verzweigen“. Der Aufbau der Verzweigung ist wie folgt:
If Bedingung Then
Anweisungen, die ausgeführt werden, wenn die Bedingung erfüllt bzw. wahr (engl. true) ist.
Else
Anweisungen, die ausgeführt werden, wenn die Bedingung nicht erfüllt bzw. falsch (engl. false) ist.
End If
Beispiel:
Sub If_Then_Else_Verzweigung()
Dim iZahl As Integer
' Initialisierung
iZahl = 5
' Verzweigung
If iZahl = 1 Then
Debug.Print "Die Zahl ist 1."
Else
Debug.Print "Die Zahl ist ungleich 1."
End If
End Sub
If…Then…Else-Verzweigung mit ElseIf
In VBA sind auch Verzweigungen möglich, die von mehr als einer Bedingung abhängig sind. Hierfür wird das Schlüsselwort „ElseIf“ verwendet. Der Aufbau der Verzweigung ist wie folgt
If Bedingung 1 Then
Anweisungen 1
[ ElseIf Bedingung 2
Anweisungen 2 ] …
[ Else
Anweisungen n ]
End If
Die Anweisungen in eckigen Klammern sind optional.
Beispiel:
Sub If_Then_Else_Verzweigung_mit_ElseIf()
Dim iZahl As Long
' Initialisierung
iZahl = 4
' Verzweigung
If iZahl = 1 Then
Debug.Print "Die Zahl ist 1."
ElseIf iZahl = 2 Then
Debug.Print "Die Zahl ist 2."
ElseIf iZahl = 3 Then
Debug.Print "Die Zahl ist 3."
Else
Debug.Print "Die Zahl ist ungleich 1, 2 oder 3."
End If
End Sub
Operatoren für Bedingungen
Vergleichsoperatoren für Bedingungen
> größer
< kleiner
= gleich
<> ungleich
>= größer gleich
<= kleiner gleich
Logische Operatoren für Bedingungen
And – Logische „Und“ Vernüpfung
Or – Logische „Oder“ Verknüpfung
Xor – Logische Exklusion zwischen zwei Ausdrücken
Not – Logische Negation eines Ausdrucks
Beispiel für die Verwendung evon Vergleichsoperatoren und logischen Operatoren für die Bedingung:
Sub If_Then()
Dim iZahl As Integer
' Initialisierung
iZahl = 4
If iZahl >= 1 And Zahl <= 5 Then
Debug.Print "Die Zahl liegt zwischen 1 und 5."
End If
End Sub
Verzweigungen verschachteln
Wie in folgendem Beispiel gezeigt können Verzweigungen ineinander verschachtelt werden:
Sub Verzweigungen_Verschachteln()
Dim strWarenkorbKaufen As String
Dim strArtDerBezahlung As String
' Initialisieren
strWarenkorbKaufen = "Ja"
strArtDerBezahlung = "Kreditkarte"
' Erste Verzweigung zur Prüfung der Kontodeckung
If strWarenkorbKaufen = "Ja" Then
' Zweite Verzweigung zur Wahl der Art der Bezahlung
If strArtDerBezahlung = "Kreditkarte" Then
Debug.Print "Die Ware wird gekauft. Die Bezahlung erfolgt mit Kreditkarte."
Else
Debug.Print "Die Ware wird gekauft. Die Bezahlung erfolgt per Rechnung."
End If
Else
Debug.Print "Die Ware wird nicht gekauft."
End If
End Sub
Select Case Verzweigung
Die Select Case-Verzeigung kann für Entscheidungen verwendet werden, die drei oder mehr Optionen beinhalten.
Sub SchulNote_Bestimmen()
Dim Note As Integer
Dim BuchstabenNote As String
Note = InputBox("Die Note eingeben")
Select Case Note
Case 1
BuchstabenNote = "Sehr gut"
Case 2
BuchstabenNote = "Gut"
Case 3
BuchstabenNote = "Befriedigend"
Case 4
BuchstabenNote = "Ausreichend"
Case 5
BuchstabenNote = "Mangelhaft"
Case 6
BuchstabenNote = "Ungenügend"
End Select
MsgBox "Die Note ist: " & BuchstabenNote
End Sub
Schleifen
For-Next Schleifen
Die Schleife wird durch eine Laufvariable gesteuert. Die Laufvariable beginnt beim Startwert und endet beim Endwert. Die Anweisungen zwischen der For-Anweisung und der Next-Anweisung sind die Anweisungen, die in der Schleife wiederholt werden.
Beispiel:
Sub For_Next_Schleife()
' Laufvariable für die Schleife definieren
Dim i As Integer
For i = 1 To 20
' Den Wert i im Direktfenster ausgeben
Debug.Print i
Next i
End Sub
Geschachtelte For-Next Schleifen
For-Next Schleifen können wie im Beispiel gezeigt geschachtelt werden.
Sub test_matrix_multiplikation()
Dim matrix1(1 To 3, 1 To 3) As Double, matrix2(1 To 3, 1 To 3) As Double, Result As Variant
Dim i As Integer, j As Integer
'
matrix1(1, 1) = 3: matrix1(1, 2) = 7: matrix1(1, 3) = 4
matrix1(2, 1) = 5: matrix1(2, 2) = -2: matrix1(2, 3) = 9
matrix1(3, 1) = 8: matrix1(3, 2) = -6: matrix1(3, 3) = -5
'
matrix2(1, 1) = 9: matrix2(1, 2) = 2: matrix2(1, 3) = 1
matrix2(2, 1) = -7: matrix2(2, 2) = 3: matrix2(2, 3) = -10
matrix2(3, 1) = 4: matrix2(3, 2) = 5: matrix2(3, 3) = -6
'
Result = Matrix_Multiplikation(matrix1, matrix2)
'
For i = LBound(Result, 1) To UBound(Result, 1)
For j = LBound(Result, 2) To UBound(Result, 2)
Debug.Print Result(i, j),
Next j
Debug.Print
Next i
End Sub
Function Matrix_Multiplikation(ByRef A() As Double, ByRef B() As Double) As Double()
' Multiplikation zweier Matrizen
Dim Temp() As Double
Dim i As Integer, j As Integer, k As Integer
'
' Prüfen, ob fuer die A und B das Matrizenprodukt A*B definiert ist, d. h.
' ob die Matrizen verkettet sind.
If UBound(A, 2) <> UBound(B, 1) Then
Debug.Print "Fehler"
ReDim Temp(-1 To -1)
Matrix_Multiplikation = Temp
Exit Function
End If
'
ReDim Temp(LBound(A, 1) To UBound(A, 1), LBound(B, 2) To UBound(B, 2))
'
For i = LBound(A, 1) To UBound(A, 1)
For j = LBound(B, 2) To UBound(B, 2)
Temp(i, j) = 0
For k = LBound(B, 1) To UBound(B, 1)
Temp(i, j) = Temp(i, j) + A(i, k) * B(k, j)
Next k
Next j
Next i
Matrix_Multiplikation = Temp
End Function
For-Next Schleife mit „Exit For“ verlassen
Eine For-Next Schleife kann man mit einem Exit For verlassen, falls eine Bedingung erfüllt ist.
Sub For_Next_Schleife_Exit_For()
' Laufvariable für die Schleife definieren
Dim i As Integer
For i = 1 To 20
If i > 10 Then Exit For
' Den Wert i im Direktfenster ausgeben
Debug.Print i
Next i
End Sub
Eine Schrittweite für die Schleife definieren:
Sie können eine Schrittweite verwenden, um einige Zählerwerte in einer For-Next-Schleife zu überspringen. Hier ist das vorherige Beispiel, das umgeschrieben wurde, um nur jeden zweiten Wert im Direktfenster auszugeben.
Sub For_Next_Schleife_mit_Schrittweite()
' Laufvariable für die Schleife definieren
Dim i As Integer
For i = 1 To 20 Step 2
' Den Wert i im Direktfenster ausgeben
debug.print i
Next i
End Sub
Eine negative Schrittweite für die Schleife definieren:
Sub For_Next_Schleife_mit_negativer_Schrittweite()
' Laufvariable für die Schleife definieren
Dim i As Integer
For i = 20 To 1 Step -1
' Den Wert i im Direktfenster ausgeben
debug.print i
Next i
End Sub
Do-While Schleife
Eine Do-While-Schleife wird so oft ausgeführt wie die „While“-Bedingung erfüllt ist.
Sub Do_While_Schleife()
Dim i As Integer
i = 0
' Die Schleife wird so lange durchlaufen wie i <= 5 ist
Do While i <= 5
i = i + 1
' Wert i im Direktfenster ausgeben
Debug.Print i
Loop
End Sub
Do-Until Schleife
Eine Do-Until Schleife wird so oft ausgeführt bis die „Until“ Bedingung erfüllt ist.
Beispiel: Eine einfache Do-Until Schleife mit der Bedingung am Schleifenanfang:
Sub Do_Until_Schleife_Anfang()
Dim i As Integer
i = 0
' Die Schleife wird so lange durchlaufen wie i <= 5 ist
Do Until i > 5
i = i + 1
' Wert i im Direktfenster ausgeben
Debug.Print i
Loop
End Sub
Beispiel: eine einfache Do-Until Schleife mit der Bedingung am Schleifenende:
Sub Do_Until_Schleife_Ende()
Dim i As Integer
i = 0
' Die Schleife wird so lange durchlaufen wie i <= 5 ist
Do
i = i + 1
' Wert i im Direktfenster ausgeben
Debug.Print i
Loop Until i > 5
End Sub
While…Wend-Schleife
Die While…Wend-Schleife ähnelt der Do…Loop-Schleife. Die Anweisungen innerhalb der Schleife werden so lange ausgeführt wie die Bedingung erfüllt ist.
Sub While_Wend_Schleife()
Dim i As Integer
i = 0
' Die Schleife wird so lange durchlaufen wie i <= 5 ist
While i <= 5
' Wert i im Direktfenster ausgeben
Debug.Print i
i = i + 1
Wend
End Sub
Nachteil der While…Wend Schleife
- Sie können die Schleife nicht wie in einer Do-Schleife (mit „Exit Do“) oder einer For-Schleife (mit „Exit For“) verlassen.
- Wie bei allen Schleifen besteht die Gefahr, eine Endlosschleife zu erstellen, wenn Sie einen Fehler in Ihrem Code machen. In Fall einer Endlosschleife müssen Sie den Code möglicherweise mit Strg+Alt+Entf beenden.
For Each-Next Schleife
Mit der For-Each-Next Schleife kann man jedes Objekt in einer Sammlung (engl. Collection) von Objekten durchlaufen.
Beispiel: die Namen aller Tabellenblätter ausgeben
Sub TabellenblattNamenAusgeben()
Dim Tabellenblatt As Worksheet
For Each Tabellenblatt In ThisWorkbook.Worksheets
' Tabellenblattname im Direktfenster ausgeben
Debug.Print Tabellenblatt.Name
Next Tabellenblatt
End Sub