🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Function in Excel — Rückgabewerte & eigene Arbeitsblattfunktionen (UDF)

|

VBA Function in Excel — Rückgabewerte & eigene Arbeitsblattfunktionen (UDF)

Getestet in: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 07.06.2026

Kurz gesagt — Eine Function ist eine Prozedur, die einen Wert zurückreicht. Diesen Wert gibst du zurück, indem du ihn dem eigenen Namen der Funktion zuweist — ein Schlüsselwort Return gibt es in VBA nicht. Und weil eine Function einen Wert liefert, kannst du sie direkt als eigene Formel (eine UDF) in eine Zelle schreiben:

Function MwstAufschlag(preis As Double, satz As Double) As Double
    MwstAufschlag = preis * (1 + satz)   ' dem NAMEN zuweisen — das ist die Rückgabe
End Function
In einer Zelle:   =MwstAufschlag(A2; 0,19)   ' deine eigene Formel, neben SUMME und XVERWEIS

Genau diese eine Fähigkeit — in einer Zelle zu leben — ist der ganze Grund, warum es Functions neben Subs gibt. Alles Weitere baut darauf auf.

Das Denkmodell: Eine Function ist ein Sub, das Bericht erstattet

Ein Sub ist ein Arbeiter, der eine Aufgabe erledigt und weitergeht. Eine Function ist ein Arbeiter, der eine Aufgabe erledigt und dir dann die Antwort sagt. Dieselbe Mechanik — ein benannter Codeblock, Argumente hinein — mit einer Ergänzung: Ein Wert kommt heraus.

Diese Ausgabe macht eine Function dort einsetzbar, wo ein Sub es nie kann: in einer Arbeitsblattzelle. Excels Raster ist dafür gebaut, das Ergebnis eines Ausdrucks anzuzeigen — also kann alles, was einen Wert zurückgibt — SUMME, XVERWEIS oder dein MwstAufschlag — in einer Zelle stehen. Ein Sub gibt nichts zurück, also hat Excel nichts für die Zelle; tippst du =Begruessen(), bekommst du #NAME?. Behalte dieses Bild, und die Entscheidung Sub gegen Function beantwortet sich von selbst.

Die eine Regel: Rückgabe über den Funktionsnamen (kein Return)

Das ist der Fehler, der jeden erwischt, der von Python, JavaScript oder C# kommt:

Function Rabatt(preis As Double) As Double
    Rabatt = preis * 0.9        ' ✅ VBA gibt über den eigenen Namen der Funktion zurück
End Function

Function Kaputt(preis As Double) As Double
    Return preis * 0.9          ' ❌ so arbeitet VBA nicht — gibt still 0 zurück
End Function

Return existiert in VBA, aber nur als Partner des uralten GoSub — es gibt keinen Wert zurück. Schreibst du Return (oder vergisst du die Zuweisung an den Namen ganz), kompiliert die Funktion klaglos und liefert still den Standardwert ihres Typs — 0, "" oder Empty. Kein Fehler, nur falsche Ergebnisse. Liefert eine UDF dauernd 0, hast du fast sicher die Zuweisung an den Namen vergessen.

Du darfst dem Namen so oft zuweisen, wie du willst (innerhalb der Funktion ist er eine normale Variable); der Wert beim Ende der Funktion ist das, was zurückkommt:

Function Note(punkte As Long) As String
    Note = "Nicht bestanden"    ' Standard
    If punkte >= 50 Then Note = "Bestanden"
    If punkte >= 80 Then Note = "Sehr gut"
End Function

Sub vs Function — die Entscheidung in einer Zeile

Vergiss die langen Vergleichstabellen. Die ganze Wahl ist eine Frage:

Braucht der Aufrufer eine Antwort zurück? Ja → Function. Nein → Sub.

Sub Function
Gibt einen Wert zurück Nein Ja (Zuweisung an den Namen)
In einer Zelle nutzbar Nein Ja (es ist eine UDF)
Erscheint im Makro-Dialog (Alt+F8) Ja, wenn Public & ohne Argumente Nein
Typische Aufgabe etwas tun (formatieren, exportieren, löschen) etwas berechnen (ein Satz, ein Etikett, ein bereinigter Text)

Ein nützliches Anzeichen: Wenn du ein Sub sein Ergebnis in eine globale Variable stopfen lässt, damit eine andere Prozedur es liest, wolltest du eine Function. Gib den Wert ordentlich zurück, statt ihn durch eine Globale zu schmuggeln.

Mach sie zur Arbeitsblattfunktion (UDF) — die Killerfunktion

Leg die Function in ein Standardmodul (Einfügen → Modul, nicht in ein Blatt- oder DieseArbeitsmappe-Modul), und sie steht sofort im Raster und in der Formel-AutoVervollständigung bereit:

Function Initialen(vollerName As String) As String
    Dim teile() As String
    teile = Split(Trim(vollerName), " ")
    Initialen = Left(teile(0), 1) & Left(teile(UBound(teile)), 1)
End Function
=Initialen("Ada Lovelace")  →  "AL"

Hier zahlt sich VBA für die Nicht-Programmierer um dich herum aus: Du schreibst die Logik einmal, und deine Kollegen nutzen sie wie jede eingebaute Funktion, ohne eine Zeile Code zu sehen.

Die Regel, an der jede neue UDF zerbricht: Eine Arbeitsblattfunktion liefert nur an ihre eigene Zelle

Hier ist die Einschränkung, die tausend Forenbeiträge erzeugt. Wird eine Function aus einer Zelle aufgerufen, läuft Excel sie in einem geschützten Modus, in dem sie nichts ändern kann — sie kann nicht in andere Zellen schreiben, keine Farbe setzen, kein Blatt umbenennen, keine MsgBox zeigen. Sie darf nur rechnen und den Wert für die aufrufende Zelle zurückgeben.

Function FaerbMich(c As Range) As String
    c.Interior.Color = vbYellow   ' ❌ tut aus einer Zelle aufgerufen NICHTS
    FaerbMich = "fertig"
End Function

Man schreibt das, sieht den Text erscheinen, aber keine Farbe, und schließt: VBA ist kaputt. Ist es nicht — UDFs sind per Design „rein". Willst du das Blatt ändern, ist das die Aufgabe eines Subs (über einen Button oder ein Ereignis), nicht einer UDF. Diese Grenze zu kennen spart Stunden: Zellformel → nur rechnen und zurückgeben; Mappe ändern → ein Sub.

Optionale und typisierte Argumente lassen eine UDF nativ wirken

Zwei Kniffe machen eine eigene Funktion angenehm nutzbar:

Function Netto(brutto As Double, Optional satz As Double = 0.19) As Double
    Netto = brutto / (1 + satz)    ' satz ist 0,19, falls der Aufrufer ihn weglässt
End Function

Optional mit Standardwert lässt =Netto(A2) und =Netto(A2; 0,16) beide funktionieren. Den Rückgabetyp anzugeben (As Double, As String, As Boolean) statt Variant macht die Funktion schneller und die Absicht klar.

Die Meinung: Erfinde keine eingebaute Funktion neu

VBA-Functions sind für Logik, die Excel noch nicht hat. Erledigt WorksheetFunction.SumIf, TEXTVERKETTEN oder XVERWEIS schon den Job, ruf das auf — eine native Funktion ist schneller, rechnet korrekt neu und braucht keine makroaktivierte Mappe. Reserviere eigene Functions für wirklich eigene Regeln: eine firmenspezifische Steuerstufe, einen Parser für unsauberen Text, eine Fachberechnung ohne Pendant. Eine UDF, die SUMME umhüllt, ist eine Last; eine UDF, die deine Geschäftsregel kodiert, ist ein Wert.

Häufige Function-Fehler (und die Lösung)

Symptom Ursache Lösung
Funktion gibt immer 0 / leer zurück Return benutzt oder den Namen nie zugewiesen Ergebnis dem eigenen Namen zuweisen: MeineFunktion = ergebnis
#NAME? in der Zelle Funktion in einem Blattmodul, oder Name falsch geschrieben In ein Standard-Modul verschieben; Schreibweise prüfen
UDF färbt/ändert keine Zellen Eine aus der Zelle aufgerufene UDF darf die Mappe nicht ändern Ein Sub per Button/Ereignis für Änderungen
#WERT! in der Zelle Ein unbehandelter Fehler in der Funktion Eingaben prüfen; Ersatzwert statt Fehler zurückgeben
UDF-Ergebnis aktualisiert nicht Funktion sieht die geänderte Eingabe nicht Geänderte Zellen als Argumente übergeben, oder Application.Volatile (sparsam)
„Erwartet: Anweisungsende" beim Aufruf Klammer-/Call-Verwechslung (wie bei Subs) Rückgabewert verwenden: x = MeineFunktion(a)

Wenn die Formel-Logik die eigentliche Arbeit ist — lass das VBA weg

Eine eigene Function ist das richtige Werkzeug für eine wiederverwendbare Berechnung. Lautet die Aufgabe aber „gleiche diese beiden Exporte ab, markiere die Zeilen ohne Treffer und summiere die Differenzen je Monat", willst du das nicht von Hand schreiben und pflegen. ExcelMaster Agent nimmt diesen Satz in Klartext-Deutsch und liefert das Ergebnis — keine UDF zum Debuggen, keine makroaktivierte Datei zum Verteilen. Kostenlos testen →

Verwandte Anleitungen

FAQ

Was ist eine Function in VBA? Eine Function ist eine benannte Prozedur, die Arbeit erledigt und einen Wert an den aufrufenden Code zurückgibt. Du definierst sie mit Function Name(args) As Typ … End Function und gibst das Ergebnis zurück, indem du es dem eigenen Namen der Funktion zuweist.

Wie gebe ich aus einer VBA-Funktion einen Wert zurück? Weise den Wert dem Funktionsnamen zu: In Function Summe() As Double schreibst du Summe = 42. Ein Return-Statement gibt es dafür nicht — Return gehört zum alten GoSub und reicht keinen Wert zurück. Der letzte dem Namen zugewiesene Wert vor dem Ende ist die Rückgabe.

Warum gibt meine VBA-Funktion 0 oder leer zurück? Weil du dem Funktionsnamen nie einen Wert zugewiesen hast (oder Return genutzt hast, das in VBA nicht funktioniert). Die Funktion gibt dann den Standard ihres Typs zurück — 0, "" oder Empty. Ergänze Funktionsname = ergebnis vor End Function.

Wie erstelle ich eine benutzerdefinierte Funktion (UDF) in Excel? Leg eine Function in ein Standardmodul (Einfügen → Modul), gib ihr einen Rückgabetyp und weise das Ergebnis dem Namen zu. Dann tippst du =DeineFunktion(...) in eine Zelle. Sie erscheint in der Formel-AutoVervollständigung wie eine eingebaute Funktion.

Warum kann meine UDF keine anderen Zellen oder Farben ändern? Ruft Excel eine Function aus einer Zelle auf, läuft sie in einem eingeschränkten Modus, der nur einen Wert zurückgeben kann — sie darf die Mappe nicht ändern (kein Schreiben in Zellen, kein Formatieren, keine MsgBox). Für Änderungen am Blatt nimm ein Sub per Button oder Ereignis statt einer UDF.

Wann nehme ich eine Function statt eines Subs? Nimm eine Function, wenn der Aufrufer einen Wert zurück braucht — eine Berechnung, einen Verweis, einen bereinigten Text — oder wenn du sie aus einer Zelle aufrufen willst. Nimm ein Sub, wenn die Prozedur nur etwas tut (formatiert, exportiert, löscht) und nichts zurückgibt.