VBA Basics: Nz, IIf, Switch und Choose

Mit If…Then und Select Case entscheiden wir, welche Anweisungen VBA ausführt. Oft brauchen wir aber einen Wert, der von einer Bedingung abhängt, etwa einen Rabattsatz oder die Vorgabe für ein leeres Feld. Dafür stehen die Funktionen Nz, IIf, Switch und Choose zur Verfügung. Sie werten alle Parameter aus und liefern in bestimmten Fällen Null, was zu Fehlern führen kann. Wie die Funktionen arbeiten und wann wir besser If…Then verwenden, liest Du in diesem Artikel.

Werte statt Anweisungen

Die Anweisungen If…Then und Select Case haben wir im Artikel VBA Basics: Bedingungen (www.vbentwickler.de/336) beschrieben. Sie führen je nach Bedingung unterschiedliche Anweisungen aus. Die Funktionen in diesem Artikel liefern dagegen einen Wert zurück. Wir setzen sie dort ein, wo ein Wert erwartet wird, zum Beispiel rechts von einer Zuweisung oder als Parameter eines anderen Aufrufs.

Die Beispiele findest Du im Modul mdlBedingungsfunktionenBeispiele der Datenbank VBABasics_Bedingungsfunktionen.accdb, zum Ausprobieren dient das Formular frmBedingungsfunktionen.

Nz: Null durch einen Wert ersetzen

Ein Feld, in das nichts eingegeben wurde und das keinen Standardwert hat, enthält den Wert Null. Rechnen wir mit diesem Wert, ist auch das Ergebnis Null:

Debug.Print 100 * (1 - Null)

Die Ausgabe lautet Null. Enthält das Feld Rabatt einer Bestellung den Wert Null, ist auch der Preis nach Rabatt Null. Die Funktion Nz ersetzt Null durch den Wert, den wir als zweiten Parameter angeben. Wir setzen Nz in der Funktion PreisMitRabatt ein. Sie erwartet den Preis als Currency und den Rabatt als Variant, damit wir auch Null übergeben können:

Public Function PreisMitRabatt(curPreis As Currency, _
        varRabatt As Variant) As Currency
    PreisMitRabatt = curPreis * (1 - Nz(varRabatt, 0))
End Function

Mit Null als Rabatt erhalten wir den Preis unverändert, mit dem Rabatt 0,1 (im Code 0.1) den um zehn Prozent verminderten Preis:

Debug.Print PreisMitRabatt(100, Null)
Debug.Print PreisMitRabatt(100, 0.1)

Die Ausgaben lauten 100 und 90. Der zweite Parameter von Nz ist optional. Fehlt er, liefert Nz für Null einen Wert vom Datentyp Variant mit dem Untertyp Empty, der in Berechnungen als 0 und in Zeichenketten als leerer Text gilt. Der Ausdruck Nz(Null) + 5 ergibt daher 5 und Nz(Null) & „x“ ergibt x.

Nz ersetzt nur Null. Ein leerer Text ist nicht Null, deshalb gibt Nz(„“, „x“) den leeren Text zurück.

Nz gehört zu Access und nicht zu VBA. In Excel, Word oder Outlook steht die Funktion ohne einen Verweis auf die Access-Bibliothek nicht zur Verfügung. Dort prüfen wir mit IsNull, ob ein Wert Null ist.

IIf: Einen von zwei Werten auswählen

IIf erwartet drei Parameter: die Bedingung, den Wert für True und den Wert für False. Als Beispiel berechnen wir den Anteil eines Teils an einer Summe. Bei der Summe 0 soll das Ergebnis ebenfalls 0 lauten, damit keine Division durch 0 stattfindet. Zuerst versuchen wir es mit IIf:

Public Function AnteilIIf(dblTeil As Double, _
        dblSumme As Double) As Double
    AnteilIIf = IIf(dblSumme = 0, 0, dblTeil / dblSumme)
End Function

Der erste Aufruf liefert 0,25, der zweite löst einen Fehler aus:

Debug.Print AnteilIIf(1, 4)
Debug.Print AnteilIIf(5, 0)

Der zweite Aufruf löst den Laufzeitfehler 11 mit der Meldung Division durch Null aus, obwohl wir die Division durch die Bedingung ausschließen wollen. VBA wertet nämlich beim Aufruf einer Funktion zuerst die Parameter aus. Bei IIf gehören dazu beide Werte, auch der Wert, den wir gar nicht benötigen.

Die Funktion AnteilIf verwendet deshalb die Anweisung If…Then, bei der VBA nur den passenden Zweig ausführt:

Public Function AnteilIf(dblTeil As Double, _
        dblSumme As Double) As Double
    If dblSumme = 0 Then
        AnteilIf = 0
    Else
        AnteilIf = dblTeil / dblSumme
    End If
End Function

AnteilIf(5, 0) liefert 0 und AnteilIf(1, 4) liefert 0,25. IIf setzen wir daher ein, wenn die Berechnung beider Werte keinen Fehler auslösen kann, etwa bei Konstanten oder einfachen Feldwerten. Kann einer der Werte einen Fehler auslösen, verwenden wir If…Then.

Switch: Mehrere Bedingungen nacheinander prüfen

Switch erwartet mehrere Paare aus einer Bedingung und einem Wert. Die Funktion liefert den Wert des ersten Paares, dessen Bedingung True ergibt. Als Beispiel ermitteln wir mit der Funktion Staffelrabatt den Rabattsatz anhand der Bestellsumme. Die Funktion gibt einen Wert vom Datentyp Variant zurück, weil Switch auch Null liefern kann:

Access, SQL und Cloud Automation

Unser exklusives Angebot für Dich!

VB-Entwickler
12,50 € im Monat*

(Gilt für den Abschluss eines Jahres-Abonnements.)

Hier geht’s weiter →

Die ersten 4 Wochen kostenlos testen – voller Zugriff auf alle Artikel, vollständigen Code und Beispieldatenbanken. Kein Risiko: Wenn es nicht passt, kündigst Du einfach innerhalb der ersten vier Wochen.

PayPal VISA Mastercard SEPA
Kostenlos & unverbindlich

Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?

Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?

In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.

Jetzt kostenloses Access-Audit anfordern →