In Datenbanken gibt es einen entscheidenden Unterschied zwischen einem leeren Feld und einem Feld mit einer leeren Zeichenkette. Aber das ist noch nicht alles! Es gibt noch weitere interessante Dinge rund um dieses Thema, wie die Funktionen IsNull, Nz und andere VBA-Elemente, die sich mit ähnlichen Dingen befassen – zum Beispiel Nothing, Empty oder Missing. In diesem Beitrag werde ich euch diese VBA-Elemente erklären und die wichtigsten Unterschiede und Anwendungsfälle aufzeigen.
Wer hat sich beim Einstieg in die Welt der Datenbanken nicht schon einmal in die Nesseln gesetzt, als er versucht hat, ein leeres Textfeld mit dem Wert “” (für eine leere Zeichenkette) zu vergleichen? Aber lasst uns das anhand eines einfachen Beispiels genauer betrachten.
Ein einfaches Formular mit einem Textfeld
Stellen wir uns vor, wir haben ein Formular mit einem Textfeld, das mit einer Tabelle verknüpft ist. Wenn der Benutzer auf die Schaltfläche “Speichern” klickt, sollen die Felder validiert und der Datensatz gespeichert werden.
Um das zu erreichen, legen wir zunächst die Prozedur für die Schaltfläche “cmdSpeichern” an. Diese Prozedur speichert einfach Änderungen am Datensatz, falls welche vorhanden sind. Hier ist der Code:
Private Sub cmdSpeichern_Click()
On Error Resume Next
RunCommand acCmdSaveRecord
Select Case Err.Number
Case 0, 2501
Case Else
MsgBox "Fehler " & Err.Number & " " & Err.Description
End Select
On Error GoTo 0
End Sub
Wie ihr seht, habe ich auch eine Fehlerbehandlung hinzugefügt, da das Speichern des Datensatzes beim Abbrechen einen Fehler auslösen könnte. Die folgende Ereignisprozedur wird durch das Ereignis “Vor Aktualisierung” ausgelöst. Sie prüft, ob das Feld “Nachname” eine leere Zeichenkette enthält. Falls nicht, wird eine entsprechende Meldung angezeigt, das Textfeld erhält den Fokus und die Aktualisierung wird abgebrochen:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me!Nachname = "" Then
MsgBox "Der Nachname ist eine leere Zeichenkette.", vbOKOnly
Me!Nachname.SetFocus
Cancel = True
End If
End Sub
Wenn wir das ausprobieren, passiert… nichts! Obwohl das Textfeld leer ist! Warum? Weil das Textfeld tatsächlich leer ist und der Inhalt nicht einer leeren Zeichenkette entspricht.
Die Access IsNull()-Funktion
Um dies zu überprüfen, verwenden wir nicht “=” oder “Null”. Und das “Is”-Schlüsselwort hilft uns hier auch nicht weiter. Stattdessen gibt es zwei Möglichkeiten. Die erste besteht darin, neben dem Vergleich mit der leeren Zeichenkette auch die Funktion IsNull() zu verwenden:
...
If IsNull(Me!Nachname) Then
MsgBox "Der Nachname ist Null.", vbOKOnly
Me!Nachname.SetFocus
Cancel = True
End If
...
Wenn wir den Datensatz jetzt speichern möchten, wird die gewünschte Meldung angezeigt. Die Bedingung “Me!Nachname = “” ” wird übrigens mit den Standardeinstellungen nicht zutreffen.
Um tatsächlich eine leere Zeichenkette in das Feld “Nachname” eingeben zu können, müssen zwei bestimmte Eigenschaften des Feldes im Tabellendesign spezielle Werte aufweisen. Die Eigenschaft “Eingabe erforderlich” muss den Wert “Ja” haben und die Eigenschaft “Leere Zeichenfolge” muss ebenfalls den Wert “Ja” haben. Erst dann können wir eine leere Zeichenfolge in das Feld eingeben.
Die Nz()-Funktion
Es geht jedoch noch eleganter! Die Funktion Nz() erwartet den zu prüfenden Ausdruck, zum Beispiel ein Textfeld. Wenn der Inhalt des Textfeldes “Null” ist, liefert die Funktion den Standardwert für diesen Datentyp zurück. Bei Textfeldern ist das eine leere Zeichenkette.
Ihr könnt jedoch auch explizit angeben, welcher Wert zurückgegeben werden soll, wenn der geprüfte Ausdruck den Wert “Null” liefert. In diesem Fall gebt ihr die leere Zeichenkette als zweiten Parameter an und prüft dann nur noch, ob die Funktion eine leere Zeichenkette zurückgeliefert hat:
...
If Nz(Me!Nachname, "") = "" Then
MsgBox "Der Nachname ist Null oder eine leere Zeichenkette.", vbOKOnly
Me!Nachname.SetFocus
Cancel = True
End If
...
Bei einem Feld, das entweder den Wert “Null” oder den Wert “0” haben kann, wird es interessanter. Nehmen wir an, wir haben ein Kombinationsfeld, mit dem der Benutzer einen Wert aus einer anderen Tabelle auswählen kann. In diesem Fall möchten wir verhindern, dass der Benutzer den Wert “0” oder “Null” auswählt. Dafür fügen wir der Ereignisprozedur der Schaltfläche “cmdSpeichern” den folgenden Code hinzu:
...
Select Case Err.Number
Case 2501, 3201
...
End Sub
...
Jetzt wisst ihr, wie ihr mit Null, leeren Zeichenketten und anderen VBA-Elementen umgehen könnt. Nutzt diese Informationen weise und vermeidet zukünftige Fehler in euren Datenbanken!