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:
IIfwertet 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 echtesIf.
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/Elsefür Bedingungen,Select Casebei vielen Werten einer Variablen.For…Nextfür feste Anzahl,For Eachfür Auflistungen (z. B.Me.Controls).Do While/Untilwenn die Anzahl offen ist — Bedingung amDooder amLoop.Exit For/Exit Dobricht vorzeitig ab,IIfist die Einzeiler-Verzweigung.- Recordset-Schleife:
Do Until rs.EOF…rs.MoveNext—MoveNextniemals vergessen.