{"id":55000914,"date":"2013-12-01T00:00:00","date_gmt":"2020-05-22T21:31:59","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=914"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"VBAFunktionen_von_A_bis_Z","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/","title":{"rendered":"VBA-Funktionen von A bis Z"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/8d4d077dad944284867955e6abdedce8\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>VBA-Funktionen kann doch jeder programmieren. Funktionsname, Parameter, R&uuml;ckgabewert &#8211; fertig! Es gibt jedoch eine ganze Menge Feinheiten, die man als Programmierer kennen sollte. Dazu geh&ouml;rt beispielsweise das Zur&uuml;ckgeben mehr als eines Ergebniswertes, das &uuml;bergeben beliebig vieler Parameter oder auch optionale Parameter. Dieser Beitrag liefert alles, was Sie f&uuml;r den Umgang mit Funktionen wissen m&uuml;ssen.<\/b><\/p>\n<p>Zur Programmierung von VBA-Funktionen muss man keine Raketentechnik studiert haben. Aber wie bereits in der Einleitung erw&auml;hnt, gibt es eine Menge verschiedener Techniken, die alle ihre Berechtigung haben. In diesem Beitrag wollen wir einmal einen &uuml;berblick &uuml;ber die M&ouml;glichkeiten von VBA-Funktionen liefern.<\/p>\n<p><b>Funktion oder Prozedur<\/b><\/p>\n<p>Zun&auml;chst m&uuml;ssen wir kl&auml;ren, was genau der Unterschied zwischen einer <b>Sub<\/b>&#8211; und einer <b>Function<\/b>-Prozedur ist. Dieser liegt genau darin, dass eine <b>Function <\/b>ein Ergebnis zur&uuml;ckliefert, das &uuml;ber die Zuweisung des Funktionsaufrufs etwa an eine Variable, ein Steuerelement et cetera direkt weiterverarbeitet werden kann. Eine Besonderheit ergibt sich bei der Zuweisung dieses Wertes innerhalb der Funktion: Dieser wird n&auml;mlich einer Variablen zugewiesen, die den Namen der Funktion hat. Ein Beispiel sieht so aus: <\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>NameDesAutors()<span style=\"color:blue;\"> As String<\/span>\r\n     NameDesAutors = \"Andr&eacute; Minhorst\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b>R&uuml;ckgabewert verarbeiten<\/b><\/p>\n<p>Diese Funktion weist ihrem R&uuml;ckgabewert ein <b>String<\/b>-Literal zu, das beim Aufruf gleich verarbeitet werden kann &#8211; zum Beispiel durch die Ausgabe im Direktfenster:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> NameDesAutors\r\nAndr&eacute; Minhorst<\/pre>\n<p>Auf die gleiche Weise k&ouml;nnen Sie den R&uuml;ckgabewert der Funktion etwa in eine Variable schreiben und dann im Direktbereich ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_NameDesAutors()\r\n     <span style=\"color:blue;\">Dim <\/span>strNameDesAutors<span style=\"color:blue;\"> As String<\/span>\r\n     strNameDesAutors = NameDesAutors\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strNameDesAutors\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Einfache Parameter<\/b><\/p>\n<p>Nun liefern Funktionen, denen Sie keinen Parameter &uuml;bergeben, nicht unbedingt immer den gleichen Wert zur&uuml;ck &#8211; Sie k&ouml;nnen ja von einer solchen Funktion auch etwa das aktuelle Datum oder die Uhrzeit ermitteln lassen oder Informationen wie den Datenbankpfad.<\/p>\n<p>Allerdings erwarten die meisten Funktionen einen oder mehrere Parameter, auf deren Basis sie das Ergebnis der Funktion ermitteln. Die Parameter einer Funktion werden zun&auml;chst im Kopf der Funktion deklariert.<\/p>\n<p>Dabei geben Sie standardm&auml;&szlig;ig den Datentyp an, da sonst der Datentyp <b>Variant<\/b> verwendet wird. Die folgende Funktion verkettet die beiden als Parameter &uuml;bergebenen Zeichenketten:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Zeichenverkettung( str1<span style=\"color:blue;\"> As String<\/span>, str2<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     Zeichenverkettung = str1 & str2\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Der Aufruf und das Ergebnis der Funktion sehen etwa wie folgt aus:<\/p>\n<pre>  Zeichenverkettung(\"Mon\",\"tag\")\r\nMontag<\/pre>\n<p><b>Optionale Parameter<\/b><\/p>\n<p>Sie k&ouml;nnen die Parameter einer Abfrage als optionale Parameter definieren. Dazu verwenden Sie das Schl&uuml;sselwort <b>Optional <\/b>vor dem eigentlichen Namen des Parameters. Dabei gibt es einen wichtigen Punkt zu beachten: Hinter einem optionalen Parameter d&uuml;rfen nur noch weitere optionale Parameter folgen.  Anderenfalls l&ouml;st bereits die Definition der Kopfzeile der Funktion einen Fehler aus (s. Bild 1).<\/p>\n<p><b>Standardwerte<\/b><\/p>\n<p>Wenn Sie sicherstellen wollen, dass der Parameter auch dann einen Wert liefert, wenn die aufrufende Routine keinen Wert f&uuml;r den Parameter &uuml;bergeben hat, k&ouml;nnen Sie wie in Listing 1 einen Standardwert angeben. Diesen tragen Sie hinter dem Datentyp, sonst direkt hinter dem Namen des Parameters ein. Wenn Sie dem Parameter der Funktion beim Aufruf einen Wert &uuml;bergeben, liefert sie das folgende Ergebnis:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EingabeGleichAusgabe(<span style=\"color:blue;\">Optional<\/span> str1<span style=\"color:blue;\"> As String<\/span> = \"Kein Wert angegeben\")\r\n     EingabeGleichAusgabe = str1\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Verwendung von Standardwerten f&uuml;r optionale Parameter<\/span><\/b><\/p>\n<pre>  EingabeGleichAusgabe(\"Wert angegeben\")\r\nWert angegeben<\/pre>\n<p>Geben Sie keinen Wert f&uuml;r den Parameter an, verwendet die Funktion den Standardwert:<\/p>\n<pre>  EingabeGleichAusgabe\r\nKein Wert angegeben<\/pre>\n<p><b>Auf optionale Parameter pr&uuml;fen<\/b><\/p>\n<p>Wenn Sie optionale Parameter verwenden, k&ouml;nnen Sie von Haus aus nur f&uuml;r den Datentyp Variant pr&uuml;fen, ob der Benutzer diese &uuml;bergeben hat. Variablen vom Typ Variant k&ouml;nnen als einziges den Wert <b>Null <\/b>aufnehmen. Ob der Parameter &uuml;bergeben wurde, pr&uuml;fen Sie mit der <b>IsMissing<\/b>-Funktion. Diese liefert den Wert <b>True <\/b>zur&uuml;ck, wenn der Parameter leer ist.<\/p>\n<p>&uuml;brigens ist <b>IsMissing <\/b>nicht gleichbedeutend mit <b>IsNull<\/b>. Dies k&ouml;nnen Sie mit der Funktion aus Listing 2 pr&uuml;fen. Wenn Sie die Prozedur komplett ohne Parameter aufrufen, erhalten Sie folgende Ausgabe im Direktfenster:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>OptionaleParameter(<span style=\"color:blue;\">Optional<\/span> str1<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> var1<span style=\"color:blue;\"> As Variant<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Fehlt str1\", IsMissing(str1), IsNull(str1)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Fehlt var1\", IsMissing(var1), IsNull(var1)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Pr&uuml;fung von optionalen Parametern mit IsMissing<\/span><\/b><\/p>\n<pre>Fehlt str1   Falsch        Falsch\r\nFehlt var1   Wahr          Falsch<\/pre>\n<p>Das hei&szlig;t, dass eine leere <b>Variant<\/b>-Variable zwar als fehlend eingestuft wird, aber nicht den Wert <b>Null <\/b>enth&auml;lt. Dies k&ouml;nnen Sie nochmals testen, indem Sie den Wert <b>Null <\/b>f&uuml;r den Parameter <b>var1 <\/b>&uuml;bergeben:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> OptionaleParameter(\"\", Null)<\/pre>\n<p>Das Ergebnis sieht so aus:<\/p>\n<pre>Fehlt str1   Falsch        Falsch\r\nFehlt var1   Falsch        Wahr<\/pre>\n<p>Die <b>Variant<\/b>-Variable mit dem Wert <b>Null <\/b>fehlt also nicht und wird mit <b>IsNull <\/b>korrekt als <b>Null <\/b>erkannt.<\/p>\n<p>Wenn Sie einen anderen Datentyp als optionalen Parameter verwenden und pr&uuml;fen wollen, ob die aufrufende Routine einen Wert f&uuml;r diesen &uuml;bergeben hat, m&uuml;ssen Sie einen kleinen Trick anwenden. Das Werkzeug daf&uuml;r haben Sie schon kennengelernt &#8211; den Standardwert. Geben Sie einfach einen Ausdruck als Standardwert an, der normalerweise nicht &uuml;bergeben wird.<\/p>\n<p>Wenn die Funktion dann aufgerufen wird, pr&uuml;fen Sie, ob der Parameter den als Standardwert angegebenen Wert enth&auml;lt oder einen anderen. Im ersten Fall k&ouml;nnen Sie dann davon ausgehen, dass kein Parameter &uuml;bergeben wurde, anderenfalls liegt ein Wert f&uuml;r den Parameter vor.<\/p>\n<p>Ein Beispiel f&uuml;r einen solchen Test zeigt die Funktion <b>StringparameterVorhanden <\/b>aus Listing 3. Sie verwendet die Zeichenkette **** als Standardwert. Der folgende Aufruf zeigt, wie die Funktion reagiert:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>StringparameterVorhanden(<span style=\"color:blue;\">Optional<\/span> str1<span style=\"color:blue;\"> As String<\/span> = \"****\")<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> str1 = \"****\"<span style=\"color:blue;\"> Then<\/span>\r\n         StringparameterVorhanden = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Pr&uuml;fung auf Vorhandensein eines Wertes f&uuml;r einen String-Parameter<\/span><\/b><\/p>\n<pre>  StringparameterVorhanden()\r\nFalsch<\/pre>\n<p>&uuml;bergeben Sie einen Wert, liefert die Funktion den Wert <b>True <\/b>zur&uuml;ck:<\/p>\n<pre>  StringparameterVorhanden(\"bla\")\r\nWahr<\/pre>\n<p><b>Benannte Parameter<\/b><\/p>\n<p>Wenn eine Funktion ein oder mehrere optionale Parameter enth&auml;lt, k&ouml;nnen Sie diese auf verschiedene Arten angeben:<\/p>\n<ul>\n<li>in der angegebenen Reihenfolge, durch Kommata getrennt und vollst&auml;ndig bis zum letzten &uuml;bergebenen Parameter oder<\/li>\n<li>mit vorangestelltem Parameternamen und durch <b>:= <\/b>von diesem getrennt.<\/li>\n<\/ul>\n<p>Im Detail bedeutet dies etwa folgende Varianten bezogen auf die Funktion aus Listing 4:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Benannt(<span style=\"color:blue;\">Optional<\/span> str1<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> str2<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> str3<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> str1 + \" \" & str2 + \" \" & str3\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Testen benannter Parameter<\/span><\/b><\/p>\n<pre>  Benannt(\"1\", \"2\")\r\n1 2 \r\n  Benannt(\"1\",,\"3\")\r\n1  3<\/pre>\n<p>Oder Sie &uuml;bergeben die Parameter in beliebiger Reihenfolge und mit vorangestelltem Parameternamen:<\/p>\n<pre>  Benannt(str3:=\"3\", str1:=\"1\")\r\n1  3<\/pre>\n<p><!--30percent--><\/p>\n<p><b>Parameter als Variablen<\/b><\/p>\n<p>Wie Sie oben gesehen haben, k&ouml;nnen Sie innerhalb der Funktion auf die Werte der Parameter zugreifen und diese als Grundlage f&uuml;r den Aufruf weiterer Funktionen verwenden oder diese auch als Teil von Ausdr&uuml;cken verwenden. Sie k&ouml;nnen die Parameter aber auch wie herk&ouml;mmliche Variablen weiterverwenden &#8211; zum Beispiel so:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Variable(str1<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Vorher: \" & str1\r\n     str1 = \"Nachher\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Nachher: \" & str1\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Ein Aufruf liefert die folgende Ausgabe:<\/p>\n<pre>Variable \"Vorher\"\r\nVorher: Vorher\r\nNachher: Nachher<\/pre>\n<p><b>ByVal und ByRef<\/b><\/p>\n<p>Das vorherige Beispiel war nur die Vorbereitung f&uuml;r die folgenden Beispiele zur Anwendung von <b>ByVal <\/b>und <b>ByRef<\/b>.<\/p>\n<p>Angenommen, Sie verwenden eine Funktion wie die Folgende:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ParameterAendern( str1<span style=\"color:blue;\"> As String<\/span>)\r\n     str1 = \"Nachher\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Wenn Sie dem Parameter <b>str1 <\/b>wie folgt die gef&uuml;llte Variable <b>str0 <\/b>&uuml;bergeben, &auml;ndert die Funktion <b>VariableAendern <\/b>den in <b>str1 <\/b>enthalten Wert. Der Wert der &uuml;bergebenen Variablen <b>str0 <\/b>wird an dieser Stelle ebenfalls ge&auml;ndert:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_ParameterAendern()\r\n     <span style=\"color:blue;\">Dim <\/span>str0<span style=\"color:blue;\"> As String<\/span>\r\n     str0 = \"Vorher\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Vorher: \" & str0\r\n     ParameterAendern str0\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Nachher: \" & str0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies belegt der folgende Aufruf samt Ausgabe:<\/p>\n<pre>Test_VariableAendern\r\nVorher: Vorher\r\nNachher: Nachher<\/pre>\n<p>Wenn Sie sicher verhindern m&ouml;chten, dass die in den &uuml;bergebenen Variablen enthaltenen Werte auch in den Originalvariablen ge&auml;ndert werden, m&uuml;ssen Sie dem Parameter den Wert <b>ByVal <\/b>voranstellen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ParameterNichtAendern( ByVal str1<span style=\"color:blue;\"> As String<\/span>)\r\n     str1 = \"Nachher\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Ein &auml;hnlicher Aufruf wie im vorherigen Beispiel sorgt zwar daf&uuml;r, dass die Funktion den Wert des Parameters intern &auml;ndert, aber die &auml;nderung wirkt sich nicht auf die beim Aufruf &uuml;bergebene Variable aus. Das Verhalten beim Weglassen des Schl&uuml;sselworts <b>ByVal <\/b>entspricht der Verwendung des Schl&uuml;sselworts <b>ByRef<\/b>.<\/p>\n<p><b>Parameterwerte nicht &auml;ndern<\/b><\/p>\n<p>Um zu verhindern, dass die Funktion die &uuml;bergebenen Parameter nicht &auml;ndert, gibt es noch eine weitere M&ouml;glichkeit: Gew&ouml;hnen Sie sich an, jeden &uuml;bergebenen Parameter zun&auml;chst in eine eigene Variable zu schreiben. Auf diese Weise werden die Parameter nicht angetastet und Sie k&ouml;nnen die Variablen mit den &uuml;bergebenen Werten nach Lust und Laune &auml;ndern.<\/p>\n<p><b>R&uuml;ckgabewerte in Parametern<\/b><\/p>\n<p>Allerdings kann es nat&uuml;rlich auch sein, dass Sie die Parameter gerade dazu nutzen m&ouml;chten, Werte zur&uuml;ckzugeben. Immerhin stellt eine Funktion standardm&auml;&szlig;ig mit dem Funktionswert nur einen R&uuml;ckgabewert bereit. Sie k&ouml;nnen aber durchaus Parameter nutzen, um die in der Funktion ermittelten Informationen an die aufrufende Routine zur&uuml;ckzugeben. Damit ist aber nat&uuml;rlich keine direkte Zuweisung an irgendwelche Objekte oder Eigenschaften m&ouml;glich.<\/p>\n<p>Voraussetzung f&uuml;r diese Vorgehensweise ist, dass Sie f&uuml;r alle R&uuml;ckgabewerte entsprechende Variablen in der aufrufenden Routine vorhalten und die Parameter nicht mit dem Schl&uuml;sselwort <b>ByVal <\/b>ausgestattet werden.<\/p>\n<p>Ein Beispiel f&uuml;r eine Funktion, die einen mit dem ersten Parameter &uuml;bergebenen Wert bearbeitet und diesen mit dem zweiten Parameter zur&uuml;ckgibt, sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Umdrehen(str1<span style=\"color:blue;\"> As String<\/span>, strResult<span style=\"color:blue;\"> As String<\/span>)\r\n     strResult = StrReverse(str1)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Funktion soll die &uuml;bergebene Zeichenfolge umdrehen und mit dem zweiten Parameter zur&uuml;ckgeben. Der Aufruf und die Auswertung des Ergebnisses sehen so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_Umdrehen()\r\n     <span style=\"color:blue;\">Dim <\/span>str0<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResult<span style=\"color:blue;\"> As String<\/span>\r\n     str0 = \"Andr&eacute;\"\r\n     Umdrehen str0, strResult\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strResult\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Parameter ohne Datentyp<\/b><\/p>\n<p>Sie k&ouml;nnen Parameter auch ohne expliziten Datentyp angeben:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Variantdatentyp(var)\r\n     Variantdatentyp = VarType(var)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Dies entspricht einer Variant-Variablen, die je nach zugewiesenem Wert entsprechend verwendet wird. Hier sind einige Beispielaufrufe:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TestVariantparameter()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Variantdatentyp(\"bla\")\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Variantdatentyp(2)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Variantdatentyp( CDate(\"1.1.2013\"))\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Variantdatentyp(Null)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die als Ergebnis gelieferten Werte mit entsprechend hinzugef&uuml;gten Konstanten:<\/p>\n<pre>  8 ''vbString\r\n  2 ''vbInteger\r\n  7 ''vbDate\r\n  1 ''vbNull<\/pre>\n<p><b>R&uuml;ckgabewert erst am Ende zuweisen<\/b><\/p>\n<p>Die meisten Funktionen liefern einen Funktionswert zur&uuml;ck. Allerdings ist das keine Pflicht: Sie k&ouml;nnen <b>Function<\/b>-Prozeduren auch ohne R&uuml;ckgabewert nutzen, dann entspricht dies einer einfachen <b>Sub<\/b>-Prozedur. Wenn Sie aber einen R&uuml;ckgabewert nutzen, sollten Sie diesen erst am Ende zuweisen. Die folgende Funktion soll beispielsweise die Konstante f&uuml;r einen Zahlenwert aus der Auflistung <b>vbVarType <\/b>liefern:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RueckgabewertAmEnde( intVartype<span style=\"color:blue;\"> As Integer<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVartype<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case intVartype\r\n         <span style=\"color:blue;\">Case <\/span>VbVarType.vbArray\r\n             strVartype = \"vbArray\"\r\n         <span style=\"color:blue;\">Case <\/span>VbVarType.vbBoolean\r\n             strVartype = \"vbBoolean\"\r\n         ...\r\n         <span style=\"color:blue;\">Case <\/span>VbVarType.vbUserDefinedType\r\n             strVartype =  \"vbUserDefinedType\"\r\n         <span style=\"color:blue;\">Case <\/span>VbVarType.vbVariant\r\n             strVartype = \"vbVariant\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     Rueckgabewert = strVartype\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Dazu deklariert sie zun&auml;chst eine Variable namens <b>strVarType<\/b>, die in einem der Zweige der <b>Select Case<\/b>-Anweisung gef&uuml;llt wird. Erst am Ende erh&auml;lt der Funktionswert den in <b>strVarType <\/b>gespeicherten Wert. Der Aufruf liefert dann folgendes Ergebnis:<\/p>\n<pre>  RueckgabewertAmEnde(8)\r\nvbString<\/pre>\n<p>Warum soll man den R&uuml;ckgabewert nicht vorher setzen Weil es geschehen kann, dass die Funktion etwa durch einen Fehler vorzeitig unterbrochen wird.   Wird dann noch <b>On Error Goto Fehler <\/b>verwendet und zu einer Markierung am Ende der Funktion gesprungen, wird der zwischendurch festgelegte Wert der Funktionswert-Variablen zur&uuml;ckgegeben, obwohl dieser vielleicht in sp&auml;teren Anweisungen einen ganz anderen Wert erhalten sollte.<\/p>\n<p><b>Statuswert als R&uuml;ckgabewert<\/b><\/p>\n<p>Bei manchen Funktionen m&ouml;chten Sie vielleicht zwei oder mehr Werte zur&uuml;ckgeben, wobei einer der Werte angibt, ob die Funktion erfolgreich ausgef&uuml;hrt wurde. Dies ist dann in der Regel der Funktionswert, die &uuml;brigen Werte landen in R&uuml;ckgabeparametern.<\/p>\n<p>Die Funktion aus Listing 5 erwartet:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Division(intZahl1<span style=\"color:blue;\"> As Integer<\/span>, intZahl2<span style=\"color:blue;\"> As Integer<\/span>, sngErgebnis<span style=\"color:blue;\"> As <\/span>_\r\n         Single, intError<span style=\"color:blue;\"> As Integer<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> Fehler\r\n     sngErgebnis = intZahl1 \/ intZahl2\r\n     Division = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\nFehler:\r\n     intError = Err.Number\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Funktion mit &uuml;bergabeparametern, R&uuml;ckgabeparametern und Funktionswert<\/span><\/b><\/p>\n<ul>\n<li>zwei &uuml;bergabeparameter (<b>intZahl1 <\/b>und <b>intZahl2<\/b>),<\/li>\n<li>einen R&uuml;ckgabewert f&uuml;r das Ergebnis (<b>sngErgebnis<\/b>),<\/li>\n<li>einen R&uuml;ckgabewert f&uuml;r den Fehler (<b>intError<\/b>) sowie <\/li>\n<li>den eigentlichen Funktionswert.<\/li>\n<\/ul>\n<p>Die aufrufende Prozedur aus Listing 6 &uuml;bergibt f&uuml;r alle vier Parameter entsprechende Variablen &#8211; zwei Zahlenwerte, die dividiert werden sollen, eine Variable f&uuml;r den R&uuml;ckgabewert und eine f&uuml;r die Fehlernummer im Falle eines Fehlers.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_Division()\r\n     <span style=\"color:blue;\">Dim <\/span>sngErgebnis<span style=\"color:blue;\"> As Single<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intError<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intZahl1<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intZahl2<span style=\"color:blue;\"> As Integer<\/span>\r\n     intZahl1 = 1\r\n     intZahl2 = 0\r\n     <span style=\"color:blue;\">If <\/span>Division(intZahl1, intZahl2, sngErgebnis, intError) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Ergebnis: \" & sngErgebnis\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & intError & \", \" & Eval(\"AccessError(\" & intError & \")\")\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Aufruf einer Funktion mit Statuswert, Ergebniswert und Fehlernummer<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft beim Aufruf direkt den R&uuml;ckgabewert der Funktion, der als Boolean deklariert ist und entweder den Wert <b>True <\/b>(<b>-1<\/b>) oder <b>False <\/b>(<b>0<\/b>) zur&uuml;ckgibt. Im Falle des Wertes <b>True <\/b>ist kein Fehler aufgetreten und die Funktion liefert mit <b>sngErgebnis <\/b>das Ergebnis der Division zur&uuml;ck.<\/p>\n<p>Wenn Sie aber etwa die Variable <b>intZahl2 <\/b>mit dem Wert <b>0 <\/b>f&uuml;llen, erzeugt die Dividion durch <b>0 <\/b>einen Fehler. In diesem Fall f&auml;hrt die Funktion nach der Division an der Markierung <b>Fehler:<\/b> fort, wo die Variable <b>intError <\/b>auf den Wert der Eigenschaft <b>Number <\/b>des <b>Err<\/b>-Objekts eingestellt wird. Den R&uuml;ckgabewert der Funktion m&uuml;ssen Sie nicht explizit auf <b>False <\/b>einstellen, da <b>Boolean<\/b>-Werte ohnehin mit dem Standardwert <b>0 <\/b>beziehungsweise <b>False <\/b>ausgestattet werden.<\/p>\n<p>In diesem Fall zeigt die aufrufende Prozedur die Fehlermeldung aus dem zweiten Teil der <b>If&#8230;Then<\/b>-Anweisung an.<\/p>\n<p><b>ParamArray als Parameter<\/b><\/p>\n<p>Ein m&auml;chtiges Werkzeug ist das sogenannte Parameter-Array, das mit dem Schl&uuml;sselwort <b>ParamArray <\/b>eingeleitet wird.<\/p>\n<p>Das erste einfache Beispiel aus Listing 7 zeigt, wie Sie das an die Funktion &uuml;bergebene <b>ParamArray <\/b>durchlaufen und die enthaltenen Werte in eine Variable schreiben. Diese Variable wird als Funktionswert zur&uuml;ckgegeben.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ParameterArray(ParamArray var()<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strParamArray<span style=\"color:blue;\"> As String<\/span>\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(var()) To <span style=\"color:blue;\">UBound<\/span>(var())\r\n         <span style=\"color:blue;\">Debug.Print<\/span> var(i)\r\n         strParamArray = strParamArray & var(i)\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     ParameterArray = strParamArray\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Funktion mit Parameter-Array<\/span><\/b><\/p>\n<p>Der folgende Aufruf &uuml;bergibt beispielsweise drei Elemente an die Funktion <b>ParameterArray<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_ParameterArray()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> ParameterArray( \"String1\", \"String2\", \"String3\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Mit einem Parameter-Array k&ouml;nnen Sie auch die Anzahl der &uuml;bergebenen Elemente zur&uuml;ckliefern &#8211; siehe Listing 8.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AnzahlElemente(ParamArray var()<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intAnzahl<span style=\"color:blue;\"> As Integer<\/span>\r\n     intAnzahl = <span style=\"color:blue;\">UBound<\/span>(var()) - <span style=\"color:blue;\">LBound<\/span>(var()) + 1\r\n     AnzahlElemente = intAnzahl\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Elemente eines ParamArrays z&auml;hlen<\/span><\/b><\/p>\n<p>Die folgende Prozedur enth&auml;lt zwei Testaufrufe &#8211; einen f&uuml;r drei Elemente und einen f&uuml;r keines:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_AnzahlElemente()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> AnzahlElemente(  \"String1\", \"String2\", \"String3\")\r\n     <span style=\"color:blue;\">Debug.Print<\/span> AnzahlElemente()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Beim Aufruf f&uuml;r drei Elemente liefert <b>UBound(var()) <\/b>den Wert <b>2 <\/b>und <b>LBound(var()) <\/b>den Wert <b>0<\/b>. Die Differenz ist <b>2 <\/b>und durch die Addition von <b>1 <\/b>erhalten wir das korrekte Ergebnis.<\/p>\n<p>Aber klappt das auch, wenn ein leeres <b>ParamArray <\/b>&uuml;bergeben wird Ja, denn dann liefert <b>UBound(var()) <\/b>den Wert <b>-1 <\/b>und <b>LBound(var())<\/b> den Wert <b>0<\/b>. Durch die Addition von <b>1 <\/b>liefert die Funktion den Wert <b>0 <\/b>zur&uuml;ck, was wiederum stimmt.<\/p>\n<p><b>Array als Paramarray<\/b><\/p>\n<p>Die folgende Prozedur versucht, ein Array aus drei Elementen als ParamArray an die Funktion <b>AnzahlElemente <\/b>zu &uuml;bergeben, um die Anzahl der im Array enthaltenen Elemente zu ermitteln:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_AnzahlElementMitArray()\r\n     <span style=\"color:blue;\">Dim <\/span>var()<span style=\"color:blue;\"> As Variant<\/span>\r\n     var = Array(\"String1\", \"String2\",  \"String3\")\r\n     <span style=\"color:blue;\">Debug.Print<\/span> AnzahlElemente(var)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis lautet 1: Ein als Argument eines <b>ParamArray<\/b>-Parameters &uuml;bergebenes Array wird also offensichtlich als ein einziges Element verwendet.<\/p>\n<p><b>Array als Parameter<\/b><\/p>\n<p>Also &uuml;bergeben wir das Array als herk&ouml;mmlichen <b>Variant<\/b>-Parameter. Die Funktion aus Listing 9 verbindet die per Array gelieferten Elemente und gibt diese als <b>String<\/b>-Variable zur&uuml;ck. Der folgende Aufruf demonstriert die Funktion:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ArrayelementeVerbinden(var()<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strErgebnis<span style=\"color:blue;\"> As String<\/span>\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(var()) To <span style=\"color:blue;\">UBound<\/span>(var())\r\n         strErgebnis = strErgebnis & var(i)\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     ArrayelementeVerbinden = strErgebnis\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Verbinden des mit einem Array gelieferten Textes<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_ArrayelementeVerbinden()\r\n     <span style=\"color:blue;\">Dim <\/span>var()<span style=\"color:blue;\"> As Variant<\/span>\r\n     var() = Array(\"String1\", \"String2\",  \"String3\")\r\n     <span style=\"color:blue;\">Debug.Print<\/span> ArrayelementeVerbinden(var)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Array als R&uuml;ckgabewert<\/b><\/p>\n<p>Nat&uuml;rlich kann eine Funktion auch ein Array zur&uuml;ckgeben. Die folgende Funktion gibt ein <b>String<\/b>-Array zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ArrayZurueckgeben() <span style=\"color:blue;\"> As String<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>strArray(2)<span style=\"color:blue;\"> As String<\/span>\r\n     strArray(0) = \"String1\"\r\n     strArray(1) = \"String2\"\r\n     strArray(2) = \"String3\"\r\n     ArrayZurueckgeben = strArray\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Das Array k&ouml;nnen Sie dann wie folgt abfragen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_ArrayZurueckgeben()\r\n     <span style=\"color:blue;\">Dim <\/span>strArray()<span style=\"color:blue;\"> As String<\/span>\r\n     strArray = ArrayZurueckgeben\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Array k&ouml;nnen Sie dann wie gewohnt durchlaufen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>VBAFunktionen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{E0A6D62E-C02D-46E8-B43F-27AAA6FC3C3D}\/aiu_914.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>VBA-Funktionen kann doch jeder programmieren. Funktionsname, Parameter, R&uuml;ckgabewert &#8211; fertig! Es gibt jedoch eine ganze Menge Feinheiten, die man als Programmierer kennen sollte. Dazu geh&ouml;rt beispielsweise das Zur&uuml;ckgeben mehr als eines Ergebniswertes, das &Uuml;bergeben beliebig vieler Parameter oder auch optionale Parameter. Dieser Beitrag liefert alles, was Sie f&uuml;r den Umgang mit Funktionen wissen m&uuml;ssen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662013,66062013,44000025],"tags":[],"class_list":["post-55000914","post","type-post","status-publish","format-standard","hentry","category-662013","category-66062013","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>VBA-Funktionen von A bis Z - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VBA-Funktionen von A bis Z\" \/>\n<meta property=\"og:description\" content=\"VBA-Funktionen kann doch jeder programmieren. Funktionsname, Parameter, R&uuml;ckgabewert - fertig! Es gibt jedoch eine ganze Menge Feinheiten, die man als Programmierer kennen sollte. Dazu geh&ouml;rt beispielsweise das Zur&uuml;ckgeben mehr als eines Ergebniswertes, das &Uuml;bergeben beliebig vieler Parameter oder auch optionale Parameter. Dieser Beitrag liefert alles, was Sie f&uuml;r den Umgang mit Funktionen wissen m&uuml;ssen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:31:59+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/8d4d077dad944284867955e6abdedce8\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"VBA-Funktionen von A bis Z\",\"datePublished\":\"2020-05-22T21:31:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/\"},\"wordCount\":2278,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8d4d077dad944284867955e6abdedce8\",\"articleSection\":[\"2013\",\"6\\\/2013\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/\",\"name\":\"VBA-Funktionen von A bis Z - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8d4d077dad944284867955e6abdedce8\",\"datePublished\":\"2020-05-22T21:31:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8d4d077dad944284867955e6abdedce8\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8d4d077dad944284867955e6abdedce8\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_von_A_bis_Z\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"VBA-Funktionen von A bis Z\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"VBA-Funktionen von A bis Z - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/","og_locale":"de_DE","og_type":"article","og_title":"VBA-Funktionen von A bis Z","og_description":"VBA-Funktionen kann doch jeder programmieren. Funktionsname, Parameter, R&uuml;ckgabewert - fertig! Es gibt jedoch eine ganze Menge Feinheiten, die man als Programmierer kennen sollte. Dazu geh&ouml;rt beispielsweise das Zur&uuml;ckgeben mehr als eines Ergebniswertes, das &Uuml;bergeben beliebig vieler Parameter oder auch optionale Parameter. Dieser Beitrag liefert alles, was Sie f&uuml;r den Umgang mit Funktionen wissen m&uuml;ssen.","og_url":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:31:59+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/8d4d077dad944284867955e6abdedce8","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"VBA-Funktionen von A bis Z","datePublished":"2020-05-22T21:31:59+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/"},"wordCount":2278,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/8d4d077dad944284867955e6abdedce8","articleSection":["2013","6\/2013","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/","url":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/","name":"VBA-Funktionen von A bis Z - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/8d4d077dad944284867955e6abdedce8","datePublished":"2020-05-22T21:31:59+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/8d4d077dad944284867955e6abdedce8","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/8d4d077dad944284867955e6abdedce8"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_von_A_bis_Z\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"VBA-Funktionen von A bis Z"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000914"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000914\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}