Kontrollstrukturen

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
 Im Beispiel ist der Startwert der Laufvariable 1 und der Endwert 20.

 

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

Schreibe einen Kommentar