In Datenbanken wie Microsoft Access gibt es einen entscheidenden Unterschied zwischen einem leeren Feld und einem Feld mit einer leeren Zeichenkette. Und es gibt noch mehr interessante Dinge rund um dieses Thema, zum Beispiel die Funktion IsNull, die Funktion Nz und weitere VBA-Elemente, die sich mit ähnlichen Dingen befassen – wie etwa Nothing, Empty oder Missing. Dieser Beitrag erläutert diese VBA-Elemente und zeigt die wichtigsten Unterschiede und Einsatzzwecke auf.
Wer hat sich beim Einstieg in die Access-Welt nicht mindestens einmal in die Nesseln gesetzt, als er versucht hat, ein leeres Textfeld mit dem Wert “” (für eine leere Zeichenkette) zu vergleichen
Schauen wir uns ein einfaches Szenario an: Das Formular aus Bild 1 ist an eine Tabelle mit einem Primärschlüsselfeld und den beiden Textfeldern Vorname und Nachname gebunden. Wenn der Benutzer auf die Schaltfläche Speichern klickt, sollen die Felder validiert werden. Verläuft die Validierung erfolgreich, wird der Datensatz gespeichert.
Bild 1: Ein einfaches Formular mit einem Textfeld
Dazu legen wir zunächst die Prozedur für die Schaltfläche cmdSpeichern an, welche schlicht eventuell vorhandene Änderungen am Datensatz speichert:
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
Die Fehlerbehandlung haben wir hinzufügt, weil der Versuch, den Datensatz zu speichern, beim Abbrechen mit der nachfolgend vorgestellten Prozedur einen Fehler auslösen würde. Die folgende Ereignisprozedur wird durch das Ereignis Vor Aktualisierung ausgelöst. Es prüft, ob das Feld Nachname eine leere Zeichenkette enthält. Ist das nicht der Fall, soll eine entsprechende Meldung erscheinen, das Textfeld den Fokus erhalten und die Aktualisierung durch Setzen des Parameters Cancel auf den Wert True abgebrochen werden:
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 dies ausprobieren, geschieht – nichts! Obwohl doch das Textfeld leer ist! Warum Weil das Textfeld tatsächlich leer ist und der Inhalt genau nicht einer leeren Zeichenkette entspricht.
Die Access IsNull()-Funktion
Diesen Sachverhalt prüfen wir nicht mit =””, und auch nicht mit = Null. Und auch das Is-Schlüsselwort kommt hier nicht zum Einsatz, Is Null hilft also auch nicht. Hier gibt es vielmehr zwei Möglichkeiten. Die erste ist, zusätzlich zum Vergleich mit der leeren Zeichenkette auch noch die Funktion IsNull einzusetzen:
... If IsNull(Me!Nachname) Then MsgBox "Der Nachname ist Null.", vbOKOnly Me!Nachname.SetFocus Cancel = True End If ...
Wenn wir den Datensatz nun speichern wollen, erscheint die gewünschte Meldung (s. Bild 2). Die Bedingung Me!Nachname = “” wird übrigens mit den Standardeinstellungen nicht eintreten.
Bild 2: Es wurde ein Textfeld mit dem Inhalt Null erkannt.
Dies erreichen Sie erst, wenn zwei bestimmte Eigenschaften des Feldes im Tabellenentwurf spezielle Werte aufweisen. Die Eigenschaft Eingabe erforderlich muss dabei den Wert Ja aufweisen, die Eigenschaft Leere Zeichenfolge ebenfalls den Wert Ja (s. Bild 3).
Bild 3: Einstellung für leere Zeichenketten
Erst dann können Sie tatsächlich eine leere Zeichenfolge in das Feld Nachname eingeben – siehe Bild 4. Um auf Nummer Sicher zu gehen, was die zugrunde liegende Tabelle angeht, können Sie auch einfach eine Kombination der beiden Bedingungen nutzen:
Bild 4: Eingabe einer leeren Zeichenkette
If Me!Nachname = "" Or IsNull(Me!Nachname) Then MsgBox "Der Nachname ist Null oder eine leere Zeichenkette.", vbOKOnly Me!Nachname.SetFocus Cancel = True End If
Die Nz()-Funktion
Und es geht noch eine Nummer eleganter: Die Funktion Nz() erwartet den zu prüfenden Ausdruck, also beispielsweise ein Textfeld wie in unserem Beispiel. Wenn der Inhalt des Textfeldes Null ist, liefert die Funktion den Wert zurück, der standardmäßig für diesen Datentyp verwendet wird. Bei Textfeldern ist das eine leere Zeichenkette.
Sie können allerdings auch explizit angeben, welcher Wert zurückgegeben werden soll, wenn der geprüfte Ausdruck den Wert Null liefert. In diesem Fall geben Sie als zweiten Parameter etwa die leere Zeichenkette an und prüfen 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 aufweisen darf, wird es interessanter. Dazu fügen wir der Tabelle ein Fremdschlüsselfeld namens AnredeID hinzu, mit der der Benutzer einen der Datensätze der Tabelle tblAnreden auswählen können soll. Für das Kombinationsfeld, mit dem wir dies erledigen wollen, hinterlegen wir die folgende Datensatzherkunft:
SELECT 0, "<Auswählen>" FROM tblAnreden UNION SELECT [tblAnreden].[AnredeID], [tblAnreden].[Anrede] FROM tblAnreden;
Dies liefert, wenn wir als Standardwert den Wert 0 einstellen, die Auswahl aus Bild 5 für einen neuen Datensatz. Wenn wir die beiden Textfelder ausfüllen und das Kombinationsfeld so beibehalten, gibt es Fehler 3201 (Der Datensatz kann nicht hinzugefügt oder geändert werden, da ein Datensatz in der Tabelle ””tblAnreden”” mit diesem Datensatz in Beziehung stehen muss.). Diesen wollen wir natürlich verhindern, und zwar mit einer passenden Validierung. Damit der Fehler nicht ausgelöst wird, nehmen wir diesen zunächst in die Ereignisprozedur der Schaltfläche cmdSpeichern hinzu:
Bild 5: Ein Kombinationsfeld, das nicht den Wert 0 oder Null liefern soll
Private Sub cmdSpeichern_Click() ... Select Case Err.Number Case 2501, 3201 ... End Sub