Lektionen/Grundlagen

Schleifen & Bedingungen

Einsteiger10 Min. Lesezeit

Bedingungen und Schleifen sind das Rückgrat jeder Automatisierung: Sie entscheiden, ob etwas passiert, und wiederholen Aktionen, bis eine Aufgabe erledigt ist. In Access iterierst du damit über Datensätze, Steuerelemente oder Importzeilen.

If … Then … Else

Die einfachste Verzweigung. Wenn die Bedingung True ist, läuft der Block:

Public Sub PruefeAlter(ByVal alter As Long)
    If alter >= 18 Then
        MsgBox "Volljährig"
    ElseIf alter >= 6 Then
        MsgBox "Schulpflichtig"
    Else
        MsgBox "Kleinkind"
    End If
End Sub

ElseIf prüft weitere Bedingungen der Reihe nach; der erste zutreffende Block gewinnt. Else ist der Rest. Für eine einzelne Prüfung geht auch die Kurzform in einer Zeile — dann ohne End If:

If IsNull(Me!txtName.Value) Then MsgBox "Name fehlt"

Logische Operatoren verknüpfst du mit And, Or und Not:

If alter >= 18 And Nz(Me!txtLand.Value, "") = "DE" Then
    ' ...
End If

Select Case

Wenn du eine Variable gegen viele Werte prüfst, ist Select Case lesbarer als eine ElseIf-Kette:

Public Function Notentext(ByVal note As Long) As String
    Select Case note
        Case 1
            Notentext = "sehr gut"
        Case 2, 3
            Notentext = "in Ordnung"
        Case 4 To 5
            Notentext = "schwach"
        Case Is >= 6
            Notentext = "ungenügend"
        Case Else
            Notentext = "unbekannt"
    End Select
End Function

Beachte die drei Schreibweisen: Einzelwerte (Case 1), Listen (Case 2, 3), Bereiche (Case 4 To 5) und Vergleiche (Case Is >= 6).

For … Next

Die Zählschleife läuft eine feste Anzahl Durchläufe. Mit Step steuerst du die Schrittweite — auch rückwärts:

Dim i As Long
For i = 1 To 5
    Debug.Print i          ' 1 2 3 4 5
Next i

For i = 10 To 0 Step -2
    Debug.Print i          ' 10 8 6 4 2 0
Next i

For Each

For Each läuft über alle Elemente einer Auflistung, ohne dass du einen Index zählen musst. In Access ideal, um über die Steuerelemente eines Formulars zu gehen:

Public Sub FelderLeeren()
    Dim ctl As Control
    For Each ctl In Me.Controls
        If ctl.ControlType = acTextBox Then
            ctl.Value = Null
        End If
    Next ctl
End Sub

Die Laufvariable (ctl) muss vom passenden Objekttyp oder Variant sein.

Do While / Do Until

Wenn du nicht weißt, wie oft du durchlaufen wirst, nimmst du eine Do-Schleife. Sie läuft, solange (While) bzw. bis (Until) eine Bedingung gilt:

Dim n As Long
n = 1
Do While n <= 100
    n = n * 2
Loop
Debug.Print n              ' 128

' Bedingung am Ende: läuft mindestens einmal
Do
    n = n - 10
Loop Until n <= 0

Steht die Bedingung am Do, wird sie vor dem ersten Durchlauf geprüft. Steht sie am Loop, läuft der Block garantiert mindestens einmal.

Vorzeitig raus: Exit For / Exit Do

Manchmal willst du eine Schleife abbrechen, sobald du gefunden hast, was du suchst:

Dim i As Long
For i = 1 To 1000
    If i * i > 500 Then
        Debug.Print "Gefunden bei " & i
        Exit For
    End If
Next i

Exit Do macht dasselbe für Do-Schleifen. Exit For/Exit Do verlässt nur die innerste Schleife.

Verschachtelte Schleifen

Schleifen dürfen ineinander liegen — etwa für eine Multiplikationstabelle. Gib jeder Ebene eine eigene Laufvariable:

Dim zeile As Long, spalte As Long
For zeile = 1 To 3
    For spalte = 1 To 3
        Debug.Print zeile & " x " & spalte & " = " & zeile * spalte
    Next spalte
Next zeile

IIf — die Kurzform in einer Zeile

IIf(Bedingung, WennWahr, WennFalsch) liefert einen von zwei Werten zurück. Praktisch für kurze Zuweisungen und in Abfragen:

Dim status As String
status = IIf(Me!txtBestand.Value > 0, "verfügbar", "ausverkauft")

Achtung: IIf wertet beide Zweige aus, bevor es wählt. Steht in einem Zweig z. B. eine Division, die durch 0 fehlschlägt, kracht es trotzdem — auch wenn dieser Zweig „gar nicht dran" wäre. Für solche Fälle nimm ein echtes If.

Praxis: über ein Recordset iterieren

Der Klassiker in Access — alle Datensätze einer Tabelle durchgehen und je nach Bedingung etwas tun:

Public Sub PreiseErhoehen()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset

    Set db = CurrentDb
    Set rs = db.OpenRecordset("SELECT * FROM Artikel", dbOpenDynaset)

    Do Until rs.EOF
        If rs!Kategorie = "Premium" Then
            rs.Edit
            rs!Preis = rs!Preis * 1.1
            rs.Update
        End If
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

Das Muster ist immer gleich: Do Until rs.EOF läuft bis zum letzten Datensatz, rs.MoveNext schaltet weiter. Vergiss MoveNext nicht — sonst hast du eine Endlosschleife.

Zusammengefasst

  • If/ElseIf/Else für Bedingungen, Select Case bei vielen Werten einer Variablen.
  • For…Next für feste Anzahl, For Each für Auflistungen (z. B. Me.Controls).
  • Do While/Until wenn die Anzahl offen ist — Bedingung am Do oder am Loop.
  • Exit For/Exit Do bricht vorzeitig ab, IIf ist die Einzeiler-Verzweigung.
  • Recordset-Schleife: Do Until rs.EOFrs.MoveNextMoveNext niemals vergessen.
Nächste Lektion
Sub, Function & Gültigkeitsbereich