{"id":55000439,"date":"2024-06-01T00:00:00","date_gmt":"2024-08-07T09:57:53","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=439"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"VBA_Basics_Mit_Arrays_programmieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/VBA_Basics_Mit_Arrays_programmieren\/","title":{"rendered":"VBA Basics: Mit Arrays programmieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/1891ad9fa05c415fae8e40ad4fd72d9f\" width=\"1\" height=\"1\" alt=\"\"><b>Arrays sind eine einfache M&ouml;glichkeit, mit VBA-Bordmitteln mehrere Werte unter einem einzigen Namen zu speichern und effizient auf diese Werte zuzugreifen. In diesem Artikel geben wir eine umfassende Einf&uuml;hrung in die Verwendung von Arrays in VBA einschlie&szlig;lich der Definition, Deklaration, Manipulation und der Anwendung in verschiedenen Szenarien. <\/b><\/p>\n<p>Arrays sind Datenstrukturen, die Elemente desselben Datentyps speichern. Dabei werden die Elemente in einer oder mehreren Dimensionen abgespeichert und k&ouml;nnen &uuml;ber den Index der verschiedenen Dimensionen abgefragt werden.<\/p>\n<p>Normalerweise gibt man den Datentyp eines Arrays explizit an (zum Beispiel <b>Integer <\/b>oder <b>String<\/b>), wir k&ouml;nnen aber auch den Datentyp <b>Variant <\/b>zum Speichern beliebiger Informationen verwenden.<\/p>\n<p>Bevor man Daten in ein Array schreiben kann, muss man diese deklarieren und dabei die Menge der aufzunehmenden Elemente definieren. Diese Menge kann man auch im Nachhinein anpassen. Die Deklaration von Arrays unterscheidet sich durch das Hinzuf&uuml;gen eines Klammernpaares zum Namen der Variablen von der Deklaration einfacher Variablen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strBeispiel(2)<span style=\"color:blue;\"> As String<\/span><\/pre>\n<h2>Index 0- oder 1-basiert<\/h2>\n<p>Der Wert <b>2<\/b> in Klammern gibt den Wert des Indexes des letzten Elements an. Damit ist nicht eindeutig angegeben, wie viele Elemente das Array aufnehmen kann. Dies h&auml;ngt davon ab, ob der Index 0- oder 1-basiert ist. Standardm&auml;&szlig;ig ist der Index 0-basiert. Wir k&ouml;nnen dies explizit festlegen, indem wir in dem jeweiligen Modul ganz oben eine entsprechende Angabe machen. Um sicherzustellen, dass wir tats&auml;chlich einen 0-basierten Index verwenden, geben wir dort folgende Zeile an:<\/p>\n<pre>Option Base 0<\/pre>\n<p>Wir k&ouml;nnen auch einen 1-basierten Index verwenden:<\/p>\n<pre>Option Base 1<\/pre>\n<p>In diesem Fall kann das Array mit der Angabe <b>2<\/b> in Klammern maximal zwei Elemente aufnehmen, sonst drei.<\/p>\n<h2>Untersten und obersten Index-Wert herausfinden<\/h2>\n<p>Meist f&uuml;r das Durchlaufen von Array in einer Schleife wollen wir den Wert f&uuml;r den untersten und den obersten Index ermitteln. Dazu dienen die folgenden beiden Funktionen:<\/p>\n<ul>\n<li><b>LBound<\/b>: Ermittelt den Wert des untersten Indexes.<\/li>\n<li><b>UBound<\/b>: Ermittelt den Wert des obersten Indexes.<\/li>\n<\/ul>\n<p>Wir testen diese Funktionen f&uuml;r ein Array mit 0-basiertem Index und dem gr&ouml;&szlig;te Indexwert von 2:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strBeispiel(2)<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Debug.Print<\/span> \"Unterer Indexwert: \" & <span style=\"color:blue;\">LBound<\/span>(strBeispiel)\r\n<span style=\"color:blue;\">Debug.Print<\/span> \"Oberer Indexwert: \" & <span style=\"color:blue;\">UBound<\/span>(strBeispiel)<\/pre>\n<p>Das Ergebnis lautet:<\/p>\n<pre>Unterer Indexwert: 0\r\nOberer Indexwert: 2<\/pre>\n<p>Stellen wir <b>Option Base 1 <\/b>ein, erhalten wir:<\/p>\n<pre>Unterer Indexwert: 1\r\nOberer Indexwert: 2<\/pre>\n<h2>Individuelle Indexwerte<\/h2>\n<p>Wir k&ouml;nnen die Indexwerte auch komplett selbst festlegen. Das folgende Array enth&auml;lt die Indexwerte <b>2 <\/b>und <b>3<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strEigene(2 To 3)<\/pre>\n<h2>Array f&uuml;llen<\/h2>\n<p>Um das Array zu f&uuml;llen, k&ouml;nnen wir direkt &uuml;ber den Indexwert auf das jeweilige Element zugreifen:<\/p>\n<pre>strBeispiel(0) = \"Text 0\"\r\nstrBeispiel(1) = \"Text 1\"\r\nstrBeispiel(2) = \"Text 2\"<\/pre>\n<p>Die Inhalte fragen wir wie folgt ab:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> strBeispiel(0)\r\n<span style=\"color:blue;\">Debug.Print<\/span> strBeispiel(1)\r\n<span style=\"color:blue;\">Debug.Print<\/span> strBeispiel(2)<\/pre>\n<h2>Array mit Werten initialisieren<\/h2>\n<p>Diese Werte k&ouml;nnen wir auch direkt in einer Zeile zuweisen. Dazu nutzen wir die <b>Array<\/b>-Funktion.<\/p>\n<p>Da sie das Ergebnis als <b>Variant<\/b>-Array liefert, m&uuml;ssen wir das Array entsprechend deklarieren. Au&szlig;erdem d&uuml;rfen wir die Anzahl der Elemente hier nicht vordefinieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>varBeispiel()<span style=\"color:blue;\"> As Variant<\/span>\r\nvarBeispiel = Array(\"Text 0\", \"Text 1\", \"Text 2\")<\/pre>\n<h2>Array per Schleife auslesen<\/h2>\n<p>Mithilfe der oben vorgestellten Funktionen <b>LBound <\/b>und <b>UBound <\/b>k&ouml;nnen wir die Elemente auch in einer Schleife durchlaufen und ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\nFor i = <span style=\"color:blue;\">LBound<\/span>(strBeispiel) To <span style=\"color:blue;\">UBound<\/span>(strBeispiel)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strBeispiel(i)\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<h2>Array-Gr&ouml;&szlig;e zur Laufzeit anpassen<\/h2>\n<p>Nicht immer wissen wir bereits vorher, wie viele Elemente das Array aufnehmen soll. Deshalb k&ouml;nnen wir es zun&auml;chst einmal ohne Angabe der Menge deklarieren und dann zur Laufzeit die Anzahl der Elemente festlegen. Dabei k&ouml;nnen wir entscheiden, ob bei dieser &Auml;nderung die vorhandenen Inhalte beibehalten oder verworfen werden sollen.<\/p>\n<p>Wir deklarieren das Array zuerst ohne Elemente:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strBeispiel()<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Dann stellen wir die Gr&ouml;&szlig;e auf den maximalen Index von <b>0 <\/b>ein, also f&uuml;r ein Element, und weisen diesem einen Wert hinzu:<\/p>\n<pre>ReDim strBeispiel(0)\r\nstrBeispiel(0) = \"Text 0\"<\/pre>\n<p>Nun wollen wir zwei weitere Werte hinzuf&uuml;gen, aber den Wert im ersten Element behalten. Dazu stellen wir wieder mit <b>ReDim <\/b>den h&ouml;chsten Index auf <b>2 <\/b>ein und verwenden zus&auml;tzlich das Schl&uuml;sselwort <b>Preserve<\/b>, um die Inhalte <\/p>\n<pre>ReDim Preserve strBeispiel(2)\r\nstrBeispiel(1) = \"Text 1\"\r\nstrBeispiel(2) = \"Text 2\"<\/pre>\n<p>Wenn wir <b>Preserve <\/b>nicht setzen w&uuml;rden, w&auml;re <b>strBeispiel(0)<\/b> anschlie&szlig;end leer beziehungsweise w&uuml;rde eine leere Zeichenkette enthalten.<\/p>\n<p>Hier wird dann der Standardwert f&uuml;r den jeweiligen Datentyp gesetzt, f&uuml;r <b>String <\/b>also eine leere Zeichenkette oder f&uuml;r Zahlendatentypen der Wert <b>0<\/b>.<\/p>\n<h2>Mehrdimensionale Arrays<\/h2>\n<p>Wir k&ouml;nnen Arrays auch mehrdimensional gestalten. Hier deklarieren wir ein Array, das in der ersten Dimension als obersten Index den Wert <b>1<\/b> enth&auml;lt und in der zweiten Dimension den Wert <b>2<\/b>. Wenn die Indizes 0-basiert sind, haben wir also ein Array mit 2 x 3 Elementen, das wir wie folgt f&uuml;llen k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>str2x3(1, 2)<span style=\"color:blue;\"> As String<\/span>\r\nstr2x3(0, 0) = \"0-0\"\r\nstr2x3(0, 1) = \"0-1\"\r\nstr2x3(0, 2) = \"0-2\"\r\nstr2x3(1, 0) = \"1-0\"\r\nstr2x3(1, 1) = \"1-1\"\r\nstr2x3(1, 2) = \"1-2\"<\/pre>\n<h2>Grenzen f&uuml;r mehrdimensionale Array ermitteln<\/h2>\n<p>Die Dimensionen selbst werden nicht 0-basiert, sondern 1-basiert indiziert, was ein wenig verwirrend sein kann. Jedenfalls ermitteln wir die Grenzen eines zweidimensionalen Arrays wie folgt. F&uuml;r die erste Dimension:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> <span style=\"color:blue;\">LBound<\/span>(str2x3, 1)\r\n<span style=\"color:blue;\">Debug.Print<\/span> <span style=\"color:blue;\">UBound<\/span>(str2x3, 1)<\/pre>\n<p>F&uuml;r die zweite Dimension:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> <span style=\"color:blue;\">LBound<\/span>(str2x3, 2)\r\n<span style=\"color:blue;\">Debug.Print<\/span> <span style=\"color:blue;\">UBound<\/span>(str2x3, 2)<\/pre>\n<h2>Mehrdimensionales Array durchlaufen<\/h2>\n<p>Um ein solches Array zu durchlaufen und auf die Werte zuzugreifen, ben&ouml;tigen wir so viele <b>For&#8230;Next<\/b>-Schleifen wie Dimensionen.<\/p>\n<p>Im folgenden Beispiel sind dies zwei:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>x<span style=\"color:blue;\"> As Integer<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>y<span style=\"color:blue;\"> As Integer<\/span>\r\n...\r\nFor x = <span style=\"color:blue;\">LBound<\/span>(str2x3, 1) To <span style=\"color:blue;\">UBound<\/span>(str2x3, 1)\r\n     For y = <span style=\"color:blue;\">LBound<\/span>(str2x3, 2) To <span style=\"color:blue;\">UBound<\/span>(str2x3, 2)\r\n         <span style=\"color:blue;\">Debug.Print<\/span> x, y, str2x3(x, y)\r\n     <span style=\"color:blue;\">Next<\/span> y\r\n<span style=\"color:blue;\">Next<\/span> x<\/pre>\n<h2>Array leeren<\/h2>\n<p>Wenn wir die Elemente des Arrays vollst&auml;ndig leeren wollen, k&ouml;nnen wir das mit der <b>Erase<\/b>-Anweisung erledigen:<\/p>\n<pre>Erase str2x3<\/pre>\n<h2>Pr&uuml;fen, ob eine Variable ein Array enth&auml;lt<\/h2>\n<p>Mit der <b>IsArray<\/b>-Funktion k&ouml;nnen wir pr&uuml;fen, ob eine Variable ein Array ist:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IsArray(str2x3)<\/pre>\n<h2>Pr&uuml;fen, ob ein Array gef&uuml;llt ist<\/h2>\n<p>Schlie&szlig;lich hier noch eine Funktion, die pr&uuml;ft, ob ein Array &uuml;berhaupt initialisiert ist:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstArrayGefuellt(var<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n      <span style=\"color:blue;\">Dim <\/span>intTest<span style=\"color:blue;\"> As Integer<\/span>\r\n      <span style=\"color:blue;\">If <\/span>IsArray(var)<span style=\"color:blue;\"> Then<\/span>\r\n          On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n          intTest = <span style=\"color:blue;\">LBound<\/span>(var)\r\n          <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n              IstArrayGefuellt = <span style=\"color:blue;\">True<\/span>\r\n          <span style=\"color:blue;\">Else<\/span>\r\n              IstArrayGefuellt = <span style=\"color:blue;\">False<\/span>\r\n          <span style=\"color:blue;\">End If<\/span>\r\n      <span style=\"color:blue;\">Else<\/span>\r\n          IstArrayGefuellt = <span style=\"color:blue;\">False<\/span>\r\n      <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>F&uuml;r ein frisch initialisiertes Array ohne Dimensionen liefert dies den Wert <b>False<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>varArray()<span style=\"color:blue;\"> As Variant<\/span>\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstArrayGefuellt(varArray)<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Arrays sind eine einfache M&ouml;glichkeit, mit VBA-Bordmitteln mehrere Werte unter einem einzigen Namen zu speichern und effizient auf diese Werte zuzugreifen. In diesem Artikel geben wir eine umfassende Einf&uuml;hrung in die Verwendung von Arrays in VBA einschlie&szlig;lich der Definition, Deklaration, Manipulation und der Anwendung in verschiedenen Szenarien. <\/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":[662024,66032024,44000026,44000025,44000033],"tags":[],"yst_prominent_words":[],"class_list":["post-55000439","post","type-post","status-publish","format-standard","hentry","category-662024","category-66032024","category-Outlook_programmieren","category-VBAProgrammierung","category-Visual_Basic_Programmierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000439","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000439"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000439\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000439"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000439"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000439"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}