Funktionen sind ähnlich wie Prozeduren. Also gilt zunächst alles, was bei Prozeduren geschrieben wurde auch für Funktionen. Allerdings gibt es einen entscheidenen Unterschied. Prozeduren können selbst Startpunkt eines Makros sein. Das geht nicht bei Funktionen. Diese können nur aus anderen Funktionen oder Prozeduren aufgerufen werden.
Wie Sie es aus den Prozeduren kennen, werden Funktionen z.B. mit der Zeile Function MeineFunktion() erstellt
Anschließend wird die Endzeile End Function wieder automatsich erstellt und zwischen diesen beiden Zeilen können Sie Ihren Code eingeben. Zum Code, den man erfassen kann, gibt es zu Prozeduren keinen Unterschied. Auch als Schlüsselwörter können grundsätzlich alle aus den Prozeduren bekannten Wörter benutzt werden.
Allerdings kann eine Funktion eine Wert zurückgeben. Dazu schauen Sie sich folgendes, modifiziertes Beispiel aus den Ausführungen zu Prozeduren an:
In diesem Beispiel brauchen Sie nicht mehr die Variable Ergebnis. Zur Demonstation ist sie jetzt nochmal als privat in der aufrufenden Prozedur deklariert. Bei der Ausgabe als Messagebox (Zeile 11) sehen Sie aber bereits, dass die Variable nicht mehr notwendig wäre. Bei der Funktion selbst (Zeile 16) wurde der Funktionsname wie eine Variable mit einem Variablentyp deklariert, wozu Sie alle Variablentypen benutzen können. In der Funktion wurde das Ergebnis gleich in den Funktionsnamen als Variable gespeichert und wird so an die aufrufende Prozedur wieder zurückgegeben.
Diese Benutzung einer Funktion ist sehr praktisch und kann Code verschlanken.
Zur Ergänzung sei noch ein Beispiel erklärt, das diese Funktion für ein Array benutzt:
In Zeile 5 wird das Array deklariert. Dies ist nicht unbedingt notwendig, wenn man mit Redim das Array später fest dimensioniert. Als Ausgabe und zur Demonstation wurde hier das Endarray deklariert. Eine Dimensionierung ist nicht notwendig, da das Zielarray automatisch die Dimensionen des ursprünglichen Arrays übernimmt. In Zeile 11 - 13 wird das Array nur mit Zahlenwerten gefüllt.
Die Funktion selbst wird als Variable für ein Array benutzt. Dazu muss man aber, da man die Funktion selbst nicht als Array deklarieren kann, ein temporäres Array in der Funktion deklarieren (Zeile 28). Die Schleife in Zeile 30 - 32 dient nur zur Berechnung der neuen Werte im Array. In Zeile 36 wird das berechnete Array der Funktion selbst zugewiesen. Damit wird die Funktion selbst praktisch zu einem Datenfeld (Array).
In Zeile 15 muss dieses Array aber trotzdem noch in der aufrufenden Prozedur einem weiteren temporären Array übergeben werden. Damit ist die Verarbeitung des Array abgeschlossen. In Zeile 18 - 19 wird dann nur noch das Ergebnis zur Überprüfung angezeigt.
Ergänzend sei noch erwähnt, dass solche Übergaben von Arrays immer ein wenig Verarbeitungszeit kosten. Daher wird ein solches Konstrukt mit besonders großen Arrays nicht zufriedenstellnd funktionieren. Einen Test ist es aber immer wert.