{"id":55000290,"date":"2016-04-01T00:00:00","date_gmt":"2020-01-24T15:59:26","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=290"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Arrays_als_Funktionsergebnis","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html","title":{"rendered":"Arrays als Funktionsergebnis"},"content":{"rendered":"<p class='introduction'>Eine Sub-Prozedur f&uuml;hrt unter VBA eine Aktion durch, eine Funktion m&ouml;glicherweise auch, doch wichtiger ist in der Regel das berechnete Ergebnis, welches sie dem Aufruf zur&uuml;ckgibt. Fast immer handelt es sich dabei um einen bestimmten gesuchten Wert. Gelegentlich erwartet die aufrufende Prozedur aber auch eine Menge von R&uuml;ckgabedaten. Hier kommen Arrays ins Spiel.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1508_Array.accdb<\/b>.<\/p>\n<h2>Multiple Ergebnisse<\/h2>\n<p>Gerade in der Datenbankprogrammierung ist die R&uuml;ckgabe von Ergebnissen, die mehr, als einen Wert enthalten, trivial. Nur kommen hier zur Auswertung gew&ouml;hnlich Datenbankobjekte zum Einsatz, deren Hauptprotagonist das <b>Recordset<\/b> ist.<\/p>\n<p>So gibt die Methode <b>OpenRecordset<\/b> von <b>DAO<\/b> nicht nur eine Serie von Daten zur&uuml;ck, sondern sogar eine zweidimensionale: in der einen Dimension die Spalten, also Felder, eines Datensatzes, in der anderen die Datens&auml;tze selbst.<\/p>\n<p>An die Zellen dieser zweidimensionalen Wertemenge gelangt man dann &uuml;ber spezielle Methoden des Objekts, statt &uuml;ber Indizes, wie das bei Arrays der Fall ist. Auf der einen Seite ist dies praktisch, auf der anderen Seite verlangt es mehr Programmierung.<\/p>\n<p>Hierzu ein Beispiel. Sie m&ouml;chten den Wert der Zelle einer Adressentabelle ermitteln, sei es etwa die dritte Spalte des vierzehnten Datensatzes. Unter <b>Excel<\/b> k&ouml;nnte das Arbeitsblatt nun tats&auml;chlich &uuml;ber Koordinaten abgefragt werden:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> WorkSheet.Cells(13,2)<\/pre>\n<p>Bei einem Recordset ist das nicht direkt m&ouml;glich. Hier s&auml;he die Routine so aus:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> rs = CurrentDb. _\r\n     OpenRecordset(\"tblAdressen\")\r\nrs.Move 13\r\n<span style=\"color:blue;\">Debug.Print<\/span> rs(2).Value<\/pre>\n<p>Hier haben wir eine Zeile mehr Code und die &uuml;bersicht ist geringer, weil die Koordinaten auf unterschiedliche Zeilen aufgeteilt sind.<\/p>\n<p>Bef&auml;nden sich alle Adressdaten in einem Array, so k&ouml;nnte &uuml;ber zwei Indizes auf die Zelle zugegriffen werden. Immerhin h&auml;lt <b>DAO<\/b> daf&uuml;r eine eigene Methode bereit:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> rs = CurrentDb. _\r\n     OpenRecordset(\"tblAdressen\")\r\nV = rs.GetRows\r\n<span style=\"color:blue;\">Debug.Print<\/span> V(2,13)<\/pre>\n<p><b>GetRows<\/b> verwandelt n&auml;mlich die Datens&auml;tze eines Recordsets in ein zweidimensionales Array, wobei dieses als Variant deklariert sein muss und die einzelnen Elemente darin ebenfalls diesen Datentyp aufweisen.<\/p>\n<p>Wollten Sie dieses Array als Ergebnis einer Funktion zur&uuml;ckgeben, dann k&auml;me diese Routine infrage:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>TabellenArray()<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rs<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> rs = CurrentDb. _\r\n         OpenRecordset(\"tblAdressen\")\r\n     TabellenArray = rs.GetRows\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Aber schauen wir uns den Umgang mit Arrays in Funktionen einmal etwas genereller an.<\/p>\n<h2>Array mit Elementen f&uuml;llen<\/h2>\n<p>Es muss nicht eine Funktion sein, wenn ein Array in einer Sub-Prozedur mit Werten gef&uuml;llt werden soll. Sie k&ouml;nnen ein Array der Prozedur auch als Argument &uuml;bergeben. Die folgende Routine vollzieht das:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>FillArray(cnt<span style=\"color:blue;\"> As Long<\/span>, _\r\n               arr<span style=\"color:blue;\"> As Variant<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n     ReDim arr(cnt)\r\n     For i = 0 To cnt\r\n         arr(i) = \"Element \" & i\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>F&uuml;r den Aufruf der Prozedur k&ouml;nnte man dies schreiben:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>arr<span style=\"color:blue;\"> As Variant<\/span>\r\nFillArray 4, arr<\/pre>\n<p>Die Prozedur nimmt als Parameter die Zahl an Elementen in der Variablen <b>cnt<\/b> entgegen und dimensioniert das Array <b>arr<\/b> dann entsprechend, um es schlie&szlig;lich in einer Schleife mit Werten zu besetzen. Die Auswertung des so erhaltenen Arrays erfolgte ebenfalls in einer Schleife:<\/p>\n<pre>For i = 0 To <span style=\"color:blue;\">UBound<\/span>(arr)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> arr(i)\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Das erstaunliche an der Sache ist, dass in der aufrufenden Prozedur das Array gar nicht als solches deklariert wurde, sondern als <b>Variant<\/b>. Der Datentyp der Variablen <b>arr<\/b> steht zu diesem Zeitpunkt also noch gar nicht fest.<\/p>\n<p>Dennoch l&auml;sst sich die <b>Redim-Anweisung <\/b>auf den Variant anwenden, wodurch VBA ihn automatisch zu einem Array macht, dessen Elemente ebenfalls vom Typ Variant sind. Deshalb kann in der Folge die Funktion <b>UBound<\/b> zum Ermitteln der Grenzen des Arrays angewandt werden.<\/p>\n<p>In dieser Version ist die vorherige Deklaration einer Variablen, die der Prozedur &uuml;bergeben wird, zwingend. Anders sieht der Fall aus, wenn, wie in Listing 1, eine Funktion <b>fuArray<\/b> zum Einsatz kommt, die als R&uuml;ckgabe direkt ein Array herausr&uuml;ckt.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>Test()\r\n     <span style=\"color:blue;\">Dim <\/span>arr<span style=\"color:blue;\"> As Variant<\/span>\r\n     arr = fuArray(4)\r\n     For i = 0 To <span style=\"color:blue;\">UBound<\/span>(arr)\r\n         <span style=\"color:blue;\">Debug.Print<\/span> arr(i)\r\n     <span style=\"color:blue;\">Next<\/span> i \r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Function <\/span>fuArray(cnt<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As String<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>arr()<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     ReDim arr(cnt)\r\n     For i = 0 To cnt\r\n         arr(i) = \"Element \" & i\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     fuArray = arr\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p class='imagetext'>Listing 1: String-Array als Ergebnis einer Funktion fuArray<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000290\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000290?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000290\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8d63f6cbe9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine Sub-Prozedur f&uuml;hrt unter VBA eine Aktion durch, eine Funktion m&ouml;glicherweise auch, doch wichtiger ist in der Regel das berechnete Ergebnis, welches sie dem Aufruf zur&uuml;ckgibt. Fast immer handelt es sich dabei um einen bestimmten gesuchten Wert. Gelegentlich erwartet die aufrufende Prozedur aber auch eine Menge von R&uuml;ckgabedaten. Hier kommen Arrays ins Spiel.<\/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":[662015,66082015,44000011],"tags":[],"class_list":["post-55000290","post","type-post","status-publish","format-standard","hentry","category-662015","category-66082015","category-VBAGrundlagen"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Arrays als Funktionsergebnis - Access [basics]<\/title>\n<meta name=\"description\" content=\"Eine Sub-Prozedur f\u00fchrt unter VBA eine Aktion durch, eine Funktion m\u00f6glicherweise auch, doch wichtiger ist in der Regel das berechnete Ergebnis, welches sie dem Aufruf zur\u00fcckgibt. Fast immer handelt es sich dabei um einen bestimmten gesuchten Wert. Gelegentlich erwartet die aufrufende Prozedur aber auch eine Menge von R\u00fcckgabedaten. Hier kommen Arrays ins Spiel.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Arrays als Funktionsergebnis - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Eine Sub-Prozedur f\u00fchrt unter VBA eine Aktion durch, eine Funktion m\u00f6glicherweise auch, doch wichtiger ist in der Regel das berechnete Ergebnis, welches sie dem Aufruf zur\u00fcckgibt. Fast immer handelt es sich dabei um einen bestimmten gesuchten Wert. Gelegentlich erwartet die aufrufende Prozedur aber auch eine Menge von R\u00fcckgabedaten. Hier kommen Arrays ins Spiel.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"8\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html\",\"name\":\"Arrays als Funktionsergebnis - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"datePublished\":\"2020-01-24T15:59:26+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Eine Sub-Prozedur f\\u00fchrt unter VBA eine Aktion durch, eine Funktion m\\u00f6glicherweise auch, doch wichtiger ist in der Regel das berechnete Ergebnis, welches sie dem Aufruf zur\\u00fcckgibt. Fast immer handelt es sich dabei um einen bestimmten gesuchten Wert. Gelegentlich erwartet die aufrufende Prozedur aber auch eine Menge von R\\u00fcckgabedaten. Hier kommen Arrays ins Spiel.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Arrays_als_Funktionsergebnis.html\",\"name\":\"Arrays als Funktionsergebnis\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000290","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000290"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000290\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000290"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000290"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}