Benutzerdefinierte Funktionen (UDF) in VBA
Eine benutzerdefinierte Funktion (englisch User Defined Function, kurz UDF) ist eine selbst geschriebene VBA-Funktion, die du anschließend genau wie SUMME oder WENN direkt in einer Zelle eintippst. Sie eignet sich für Berechnungen, die es als eingebaute Funktion nicht gibt – z. B. eigene Rabattlogiken oder Textbausteine.
Eine UDF schreiben
- VBA-Editor öffnen mit Alt+F11.
- Im Projekt-Explorer: Einfügen → Modul (UDFs gehören in ein normales Modul, nicht in ein Tabellenblatt-Modul).
- Eine Funktion mit
FunctionstattSubbeginnen und mitEnd Functionabschließen.
Function Rabattpreis(Preis As Double, ProzentSatz As Double) As Double
Rabattpreis = Preis * (1 - ProzentSatz)
End Function
Diese Funktion nimmt einen Preis und einen Prozentsatz entgegen und gibt den reduzierten Preis zurück. Nach dem Speichern der Arbeitsmappe im Format .xlsm steht sie sofort als Formel zur Verfügung:
| A | B | C | |
|---|---|---|---|
| 1 | Artikel | Preis | Rabattpreis |
| 2 | Notizbuch | 4,90 € | 4,17 € |
=Rabattpreis(B2; 0,15) → 4,17 €
Aufruf im Menüband finden
Eigene Funktionen erscheinen im Funktions-Assistenten (Umschalt+F3) standardmäßig unter der Kategorie Benutzerdefiniert, sortiert nach dem Modulnamen.
Kommentiere deine UDF mit '-Zeilen direkt über der Function-Zeile. So findest du auch Monate später schnell wieder, was die Funktion tut und welche Parameter sie erwartet.
Grenzen von UDFs
- Eine UDF, die als Formel in einer Zelle aufgerufen wird, darf keine anderen Zellen verändern – sie darf nur einen Wert zurückgeben. Für Aktionen wie Formatieren oder Werte in andere Zellen schreiben brauchst du ein normales Makro (
Sub), keine UDF. - UDFs sind bei sehr großen Arbeitsmappen oft langsamer als eingebaute Funktionen, da VBA-Code nicht so optimiert ausgeführt wird.
Moderne Alternative: LAMBDA
Für einfachere, wiederverwendbare Berechnungen ganz ohne VBA bietet Excel 365 die Funktion LAMBDA, kombiniert mit dem Namens-Manager. Das obige Beispiel ließe sich auch so als benannte Formel definieren: =LAMBDA(Preis;ProzentSatz; Preis*(1-ProzentSatz)). Der Vorteil: keine Makro-Datei nötig, funktioniert auch in reinen .xlsx-Dateien. Für komplexere Logik mit Schleifen oder externen Zugriffen bleibt VBA aber die richtige Wahl.
Häufige Fehler
- #NAME? in der Zelle – die Arbeitsmappe wurde nicht im
.xlsm-Format gespeichert, oder Makros sind deaktiviert. - UDF ändert scheinbar nichts – UDFs können, wie oben beschrieben, keine anderen Zellen beschreiben. Für solche Fälle ein Makro mit
Subverwenden. - Funktion fehlt in anderen Arbeitsmappen – UDFs sind standardmäßig an die Arbeitsmappe gebunden, in der sie definiert wurden. Für die dauerhafte Nutzung überall bietet sich ein persönliches Makroarbeitsmappe (PERSONAL.XLSB) an.