{"id":55000963,"date":"2014-12-01T00:00:00","date_gmt":"2022-01-03T18:31:55","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=963"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Mit_Arrays_arbeiten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/","title":{"rendered":"Mit Arrays arbeiten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/e2c998674d8c4b13ba1f356bbf61980c\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>&uuml;ber Arrays unter VBA wurde schon vieles geschrieben und gesagt. Dennoch gibt es praktische Hinweise, die man gelegentlich ben&ouml;tigt, nicht so einfach im Internet. Also werfen wir in diesem Beitrag einen genaueren Blick auf die M&ouml;glichkeiten, die Arrays bieten, und liefern einige neue Funktionen rund um die Felder zum tempor&auml;ren Speichern und Bereitstellen von Daten. Unter anderem sehen wir uns an, wie Sie die Inhalte von Arrays zu Debugging-Zwecken im Direktbereich oder in einer Excel-Tabelle ausgeben oder wie Sie pr&uuml;fen, ob ein Array leer ist.<\/b><\/p>\n<p><b>Array aus Datensatz f&uuml;llen<\/b><\/p>\n<p>Manchmal m&ouml;chten Sie vielleicht die Daten eines oder mehrerer Felder eines Datensatzes in einem Array speichern, um diese Daten performant bereitzustellen.<\/p>\n<p>Wenn Sie nur ein Feld eintragen m&ouml;chten, reicht ein eindimensionales Array aus. Dieses f&uuml;llen Sie mithilfe der Funktion <b>RecordsetInArrayEindimensional<\/b> aus Listing 1. Die Funktion erwartet das einzulesende Recordset mit dem Parameter <b>rst<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RecordsetInArrayEindimensional(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset)<span style=\"color:blue;\"> As Variant<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>arr()<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         ReDim Preserve arr(rst.AbsolutePosition)\r\n         arr(rst.AbsolutePosition) = rst.Fields(0).Value\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     RecordsetInArrayEindimensional = arr\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einlesen eines Feldes eines Recordsets in ein eindimensionales Array<\/span><\/b><\/p>\n<p>Es deklariert ein Array namens <b>arr <\/b>mit dem Datentyp <b>Variant<\/b>. In einer  <b>Do While<\/b>-Schleife durchl&auml;uft die Funktion alle Datens&auml;tze des Recordsets und f&uuml;hrt dabei zwei Anweisungen aus:<\/p>\n<ul>\n<li>das ReDimensionieren des Arrays entsprechend der aktuellen Position des Datensatzzeigers (<b>AbsolutePosition<\/b>) sowie<\/li>\n<li>das Zuweisen des Werts des ersten Felds des aktuellen Datensatzes an die entsprechende Position des Arrays.<\/li>\n<\/ul>\n<p>Danach &uuml;bergibt die Funktion das Array als Funktionswert an die aufrufende Routine. Diese sieht beispielsweise wie in Listing 2 aus. Die Routine f&uuml;llt das Recordset-Objekt mit den Datens&auml;tzen der Tabelle <b>tblArtikel<\/b>, wobei nur das Feld <b>Artikelname <\/b>ber&uuml;cksichtigt wird.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_RecordsetInArray()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>arr()<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT Artikelname FROM tblArtikel\", dbOpenDynaset)\r\n     arr = RecordsetInArrayEindimensional(rst)\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(arr) 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><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Test zum Einlesen eines eindimensionalen Arrays aus einem Recordset<\/span><\/b><\/p>\n<p>Dann ruft sie die Funktion <b>Recordset-In-ArrayEindimensional <\/b>auf und &uuml;bergibt das Recordset als Parameter.<\/p>\n<p>Um zu pr&uuml;fen, ob alle Werte wie gew&uuml;nscht in das Array eingelesen wurden, durchl&auml;uft die Routine anschlie&szlig;end in einer <b>For&#8230;Next<\/b>-Schleife alle Elemente des Arrays und gibt den jeweils aktuellen Wert im Direktbereich des VBA-Editors aus.<\/p>\n<p><b>ReDim vorziehen<\/b><\/p>\n<p>Wenn schon vorher klar ist, wie viele Elemente im Array landen sollen, k&ouml;nnen Sie dieses nat&uuml;rlich auch bereits vor dem Eintritt in die <b>Do While<\/b>-Schleife redimensionieren.<\/p>\n<p>Der Versuch, dies direkt beim Deklarieren des Arrays zu erledigen, schl&auml;gt allerdings fehl &#8211; mit der Fehlermeldung <b>Konstanter Ausdruck erforderlich<\/b>, wie in Bild 1 zu erkennen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_963_001.png\" alt=\"Automatische Erg&auml;nzung eines Feldnamens\" width=\"650\" height=\"294,6999\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Automatische Erg&auml;nzung eines Feldnamens<\/span><\/b><\/p>\n<p>Also deklarieren wir das Array in einer neuen Version der Funktion (s. Listing 3) zun&auml;chst ohne Angabe der Anzahl der enthaltenen Elemente und &auml;ndern diese dann sp&auml;ter mit der <b>ReDim<\/b>-Anweisung. Dieser &uuml;bergeben wir den Ausdruck <b>rst.RecordCount<\/b>. Damit diese Eigenschaft des Recordsets immer den richtigen Wert liefert, verschieben wir den Datensatzzeiger zuvor mit <b>MoveLast <\/b>einmal an das Ende der Datensatzgruppe und mit <b>MoveFirst <\/b>wieder an die erste Position.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RecordsetInArrayEindimensional(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset)<span style=\"color:blue;\"> As Variant<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>arr()<span style=\"color:blue;\"> As Variant<\/span>\r\n     rst.MoveLast\r\n     rst.MoveFirst\r\n     ReDim arr(rst.RecordCount - 1)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         arr(rst.AbsolutePosition) = rst.Fields(0).Value\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     RecordsetInArrayEindimensional = arr\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Einlesen eines eindimensionalen Arrays mit vorheriger Dimensionierung<\/span><\/b><\/p>\n<p>Im Gegensatz zum ReDimensionieren innerhalb der <b>Do While<\/b>-Schleife entf&auml;llt hier nat&uuml;rlich das <b>Preserve<\/b>-Schl&uuml;sselwort der <b>ReDim<\/b>-Anweisung, denn das Array ist ja ohnehin noch leer.<\/p>\n<p>Gleichzeitig beheben wir noch einen kleinen Fehler bei der Dimensionierung: Dort haben wir n&auml;mlich zun&auml;chst den Wert von <b>rst.RecordCount <\/b>als Obergrenze angegeben. Die Untergrenze ist jedoch, wenn nicht anders angegeben, <b>0<\/b>. Das hei&szlig;t, dass wir das Array um ein Element zu gro&szlig; dimensionieren w&uuml;rden. Also &auml;ndern wir den Ausdruck f&uuml;r die obere Grenze in <b>rst.RecordCount &#8211; 1<\/b>.<\/p>\n<p><b>Mehrdimensionale Arrays mit Daten f&uuml;llen<\/b><\/p>\n<p>Wenn Sie nun mehrere Felder in das Array einlesen m&ouml;chten, m&uuml;ssen Sie dieses entsprechend anders dimensionieren &#8211; n&auml;mlich als zweidimensionales Array. Dazu deklarieren wir in der Funktion <b>RecordsetInArrayMehrdimensional <\/b>zun&auml;chst wieder das Array <b>arr<\/b> (s. Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RecordsetInArrayMehrdimensional(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset)<span style=\"color:blue;\"> As Variant<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>arr()<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     rst.MoveLast\r\n     rst.MoveFirst\r\n     ReDim arr(rst.RecordCount - 1, rst.Fields.Count - 1)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         For Each fld In rst.Fields\r\n             arr(rst.AbsolutePosition, i) = fld.Value\r\n             i = i + 1\r\n         <span style=\"color:blue;\">Next<\/span> fld\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     RecordsetInArrayMehrdimensional = arr\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Einlesen eines mehrdimensionalen Arrays mit vorheriger Dimensionierung<\/span><\/b><\/p>\n<p> Anschlie&szlig;end redimensioniert die Funktion es, und zwar mit der Anzahl der Datens&auml;tze in der ersten Dimension und mit der Anzahl der Felder in der zweiten. Danach durchl&auml;uft die Funktion in einer &auml;u&szlig;eren <b>Do While<\/b>-Schleife die Datens&auml;tze des Recordsets und in einer inneren Schleife die Felder &#8211; und zwar &uuml;ber die <b>Fields<\/b>-Auflistung des Recordsets. Innerhalb der Schleife f&uuml;llt die Funktion das Array. Da <b>fld <\/b>keinen Index mitliefert, m&uuml;ssen wir immer noch umst&auml;ndlich eine Z&auml;hlervariable namens <b>i <\/b>mitlaufen lassen, um die Position f&uuml;r die zweite Dimension anzugeben. Dies k&ouml;nnen wir auch noch eleganter erledigen, indem wir die innere Schleife als <b>For&#8230;Next<\/b>&#8211; statt als <b>For&#8230;Each<\/b>-Schleife implementieren:<\/p>\n<pre><span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n     For i = 0 To rst.Fields.Count - 1\r\n         arr(rst.AbsolutePosition, i) _\r\n             = rst.Fields(i)\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     rst.Move<span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">Loop<\/span><\/pre>\n<p>Die Funktion zum Testen dieser Funktion finden Sie in Listing 5. Die Prozedur erstellt diesmal ein Recordset mit den beiden Feldern <b>ArtikelID <\/b>und <b>Artikelname <\/b>der Tabelle <b>tblArtikel<\/b> und &uuml;bergibt dieses als Parameter an die Funktion <b>RecordsetInArrayMehrdimensional<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_RecordsetInArrayMehrdimensional()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>arr()<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT ArtikelID, Artikelname FROM tblArtikel\", _\r\n         dbOpenDynaset)\r\n     arr = RecordsetInArrayMehrdimensional(rst)\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(arr, 1) To <span style=\"color:blue;\">UBound<\/span>(arr, 1)\r\n         For j = <span style=\"color:blue;\">LBound<\/span>(arr, 2) To <span style=\"color:blue;\">UBound<\/span>(arr, 2)\r\n             <span style=\"color:blue;\">Debug.Print<\/span> arr(i, j);\r\n         <span style=\"color:blue;\">Next<\/span> j\r\n         <span style=\"color:blue;\">Debug.Print<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Testprozedur zum Einlesen mehrdimensionaler Arrays<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Das Ergebnis durchl&auml;uft die Prozedur dann in zwei verschachtelten <b>For&#8230;Next<\/b>-Schleifen. Bei der Ermittlung der Arraygrenzen der beiden Dimensionen verwenden wir nat&uuml;rlich eine andere Form der <b>LBound<\/b>&#8211; und <b>UBound<\/b>-Funktionen. Die untere Grenze der ersten Dimension ermitteln wir beispielsweise mit <b>LBound(arr, 1)<\/b>, die der zweiten Dimension mit <b>LBound(arr, 2)<\/b>.<\/p>\n<p>Innerhalb der inneren Schleife sollen die beiden Feldwerte des aktuellen Datensatzes ausgegeben werden. Damit diese in einer Zeile erscheinen, versehen wir die <b>Debug.Print<\/b>-Anweisungen noch mit einem folgenden Semikolon (<b>;<\/b>). Dies verhindert den Sprung in die folgende Zeile.<\/p>\n<p>Allerdings w&uuml;rden so alle Elemente hintereinander in eine einzige Zeile geschrieben werden. Also m&uuml;ssen wir f&uuml;r jeden Datensatz, der ja in der &auml;u&szlig;eren Schleife durchlaufen wird, noch eine <b>Debug.Print<\/b>-Anweisung ohne Parameter einf&uuml;gen.<\/p>\n<p><b>Funktion zur Ausgabe von Arrays<\/b><\/p>\n<p>Damit haben wir nun zwei Funktionen geschaffen, mit denen wir Arrays etwa auf Basis eines Recordsets f&uuml;llen k&ouml;nnen. Allein die Ausgabe zur Pr&uuml;fung des Arrays mit dem Durchlaufen der Elemente der einzelnen Dimensionen steckt noch in den beiden Testprozeduren.<\/p>\n<p>Dabei w&auml;re doch gerade die Ausgabe des Inhalts eines Arrays bei Entwickeln hilfreich, denn damit k&ouml;nnte man auf die Schnelle herausfinden, ob das Array auch die erwarteten Daten enth&auml;lt. Also programmieren wir uns eine kleine Funktion, welche ein Array als Parameter erwartet und dieses im Direktbereich von Access ausgibt.<\/p>\n<p>Die Prozedur hei&szlig;t <b>OutputVariant <\/b>und ist in Listing 6 zu finden. Die Prozedur deklariert zwei Variablen namens <b>i <\/b>und <b>j <\/b>zum Durchlaufen der verschiedenen Dimensionen des Arrays sowie vier Variablen namens <b>int1Min<\/b>, <b>int1Max<\/b>, <b>int2Min <\/b>und <b>int2Max<\/b>, um die Unter- und Obergrenzen der Dimensionen des Arrays aufzunehmen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OutputVariant(varArray()<span style=\"color:blue;\"> As Variant<\/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>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>int1Min<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>int1Max<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>int2Min<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>int2Max<span style=\"color:blue;\"> As Integer<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     int1Min = <span style=\"color:blue;\">LBound<\/span>(varArray, 1)\r\n     int1Max = <span style=\"color:blue;\">UBound<\/span>(varArray, 1)\r\n     int2Min = <span style=\"color:blue;\">LBound<\/span>(varArray, 2)\r\n     int2Max = <span style=\"color:blue;\">UBound<\/span>(varArray, 2)\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>int2Max = 0<span style=\"color:blue;\"> Then<\/span>\r\n         For i = int1Min To int1Max\r\n             <span style=\"color:blue;\">Debug.Print<\/span> varArray(i);\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n         <span style=\"color:blue;\">Debug.Print<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         For i = int1Min To int1Max\r\n             For j = int2Min To int2Max\r\n                 <span style=\"color:blue;\">If <\/span>varArray(i, j) = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">Debug.Print<\/span> \" x \";\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                    <span style=\"color:blue;\">Debug.Print<\/span> varArray(i, j);\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Next<\/span> j\r\n             <span style=\"color:blue;\">Debug.Print<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\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: Prozedur zur Ausgabe von Arrays<\/span><\/b><\/p>\n<p>Diese Variablen f&uuml;llt die Prozedur in den folgenden vier Zeilen, f&uuml;r die durch die Anweisung <b>On Error Resume Next <\/b>die Fehlerbehandlung deaktiviert wurde. Dies hat den Hintergrund, dass die Anzahl der Dimensionen ja auch eins sein kann. In diesem Fall f&uuml;hrt der Zugriff etwa auf <b>LBound(varArray, 2) <\/b>zum Fehler <b>Index au&szlig;erhalb des g&uuml;ltigen Bereichs<\/b>.<\/p>\n<p>In diesem Fall beh&auml;lt die Variable <b>int2Max<\/b> den Wert <b>0<\/b>, was im n&auml;chsten Schritt gepr&uuml;ft wird. Dann liegt offensichtlich ein eindimensionales Array vor, das innerhalb einer einfachen <b>For&#8230;Next<\/b>-Schleife &uuml;ber die Werte von <b>int1Min <\/b>bis <b>int1Max <\/b>ausgegeben werden kann.<\/p>\n<p>Anderenfalls liegt wohl ein mehrdimensionales Array vor, f&uuml;r dessen Ausgabe zwei <b>For&#8230;Next<\/b>-Schleifen mit den Laufvariablen <b>i <\/b>und <b>j <\/b>durchlaufen werden.<\/p>\n<p>Um leere Inhalte besser erkennen zu k&ouml;nnen, sollen diese durch ein <b>x <\/b>ersetzt werden. Dies k&ouml;nnen Sie gegebenenfalls &auml;ndern, wenn Sie ein anderes oder gar kein Zeichen w&uuml;nschen. Auch hier wenden wir wieder den Trick mit dem Semikolon (<b>;<\/b>) hinter der <b>Debug.Print<\/b>-Anweisung an, um die Elemente der zweiten Dimension in einer Zeile auszugeben.<\/p>\n<p>Diese Routine hat allerdings eine Einschr&auml;nkung, die mit dem Datentyp des Arrays zusammenh&auml;ngt. Wenn Sie es einmal mit der folgenden Prozedur testen, die ein Array mit dem Datentyp <b>Integer<\/b> f&uuml;llt und dieses dann der Routine <b>OutputVariant <\/b>&uuml;bergibt, erhalten wir den Fehler aus Bild 2:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_963_002.png\" alt=\"Fehler bei falschen Array-Datentyp\" width=\"650\" height=\"298,2048\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Fehler bei falschen Array-Datentyp<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TestArrayInteger()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>arr(9, 9)<span style=\"color:blue;\"> As Integer<\/span>\r\n     For i = 0 To 9\r\n         For j = 0 To 9\r\n             arr(i, j) = 1\r\n         <span style=\"color:blue;\">Next<\/span> j\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     OutputVariant arr\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Anscheinend ben&ouml;tigen wir also f&uuml;r jeden Datentyp eine eigene Funktion zur Ausgabe der Daten eines Arrays &#8211; dabei brauchen Sie allerdings nur den Datentyp sowie den Funktionsnamen zu &auml;ndern.<\/p>\n<p><b>x statt leerer Felder ausgeben<\/b><\/p>\n<p>Manch einer mag sich fragen, wozu wohl die Ausgabe des Zeichens x statt eines leeren Feldes dienen mag. Der Grund ist einfach: Auf diese Weise lassen sich beispielsweise Arrays, die zu gro&szlig; dimensioniert wurden, enttarnen. Schauen Sie sich das folgende Beispiel an:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TestMitPlatzhaltern()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>arr(10, 10)<span style=\"color:blue;\"> As Variant<\/span>\r\n     For i = 0 To 9\r\n         For j = 0 To 9\r\n             arr(i, j) = \"bla\"\r\n         <span style=\"color:blue;\">Next<\/span> j\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     OutputVariant arr\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier wird ein Array scheinbar komplett mit dem Wert <b>bla <\/b>gef&uuml;llt. Wenn wir uns die Ausgabe der Prozedur <b>OutputVariant <\/b>f&uuml;r das Array <b>arr <\/b>ansehen, werden wir jedoch eines Besseren belehrt (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_963_003.png\" alt=\"Dieses Array hat mehr Elemente als gedacht.\" width=\"450\" height=\"249,1887\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Dieses Array hat mehr Elemente als gedacht.<\/span><\/b><\/p>\n<p>Hier ist ein typischer Fehler passiert: Im Eifer des Gefechts ging ich davon aus, dass ich f&uuml;r die Dimensionierung eines Arrays mit zehn mal zehn Elementen den Ausdruck <b>arr(10, 10) <\/b>angeben m&uuml;sste. Allerdings sind die Werte f&uuml;r die Dimensionierung 0-basiert, sodass <b>arr(9, 9) <\/b>korrekt gewesen w&auml;re. Durch die Ausgabe des Buchstaben <b>x <\/b>statt der leeren Elemente konnte ich erkennen, dass die Dimensionierung etwas zu gro&szlig; geraten ist.<\/p>\n<p><b>Array mit anderen Datentypen als Variant ausgeben<\/b><\/p>\n<p>Wenn Sie ein Array eines anderen Datentyps im Direktfenster ausgeben, m&uuml;ssen Sie die Prozedur <b>OutputVariant <\/b>anpassen. Dazu reicht es aus, den Datentyp in der ersten Zeile der Prozedur durch den gew&uuml;nschten Datentyp zu ersetzen &#8211; und nat&uuml;rlich den Dateinamen. F&uuml;r ein <b>Integer<\/b>-Array sieht das etwa so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OutputInteger(varArray()<span style=\"color:blue;\"> As Integer<\/span>)<\/pre>\n<p>Es gibt jedoch noch eine andere M&ouml;glichkeit, die uns doch noch die Erstellung mehrerer gleichartiger Prozeduren erspart: Wir lassen einfach die Klammern hinter dem Parameter f&uuml;r das Array weg. Heraus kommt dann dieser Prozedurkopf mit dem neuen Namen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OutputArray(varArray<span style=\"color:blue;\"> As Variant<\/span>)<\/pre>\n<p><b>Array zu gro&szlig; f&uuml;r Direktbereich<\/b><\/p>\n<p>Fr&uuml;her oder sp&auml;ter werden Sie mit Arrays arbeiten, die zu gro&szlig; sind, um sinnvoll im Direktbereich ausgegeben zu werden.<\/p>\n<p>Aber zum Gl&uuml;ck gibt es ja Excel: Geben Sie doch das Array einfach in einer Tabelle unter Excel aus, dann k&ouml;nnen Sie diese in aller Ruhe analysieren. Wenn das Array beispielsweise die Daten der Tabelle <b>tblArtikel<\/b> enth&auml;lt, sieht das Ergebnis unter Excel wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_963_004.png\" alt=\"Array nach Excel ausgeben\" width=\"575\" height=\"442,4965\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Array nach Excel ausgeben<\/span><\/b><\/p>\n<p>Je nach der Gr&ouml;&szlig;e des Arrays kann die Ausgabe nach Excel schon deshalb sinnvoll sein, da der Direktbereich des VBA-Editors nur ein begrenztes Fassungsverm&ouml;gen aufweist.<\/p>\n<p>Schauen wir uns die Prozedur <b>OutputExcel<\/b> im Detail an. Sie erwartet nat&uuml;rlich das zu untersuchende Array als Parameter (s. Listing 7).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OutputExcel(varArray<span style=\"color:blue;\"> As Variant<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objWorksheet<span style=\"color:blue;\"> As <\/span>Excel.Worksheet\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>int1Min<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>int1Max<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>int2Min<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>int2Max<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objWorksheet = GetWorksheet\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     int1Min = <span style=\"color:blue;\">LBound<\/span>(varArray, 1)\r\n     int1Max = <span style=\"color:blue;\">UBound<\/span>(varArray, 1)\r\n     int2Min = <span style=\"color:blue;\">LBound<\/span>(varArray, 2)\r\n     int2Max = <span style=\"color:blue;\">UBound<\/span>(varArray, 2)\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>int2Max = 0<span style=\"color:blue;\"> Then<\/span>\r\n         For i = int1Min To int1Max\r\n             objWorksheet.Cells(i + 1, 1) = i + 1\r\n             <span style=\"color:blue;\">If <\/span>varArray(i) = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n                 objWorksheet.Cells(i + 1, 2) = varArray(i)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         For i = int1Min To int1Max\r\n             For j = int2Min To int2Max\r\n                 <span style=\"color:blue;\">If <\/span>varArray(i, j) = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n                     objWorksheet.Cells(i + 1 - int1Min, j + 1 - int2Min) = \"x\"\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     objWorksheet.Cells(i + 1 - int1Min, j + 1 - int2Min) = _\r\n                         varArray(i, j)\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Next<\/span> j\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     objWorksheet.Columns(\"A:FF\").AutoFit\r\n     objWorksheet.Rows(\"1:256\").AutoFit\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: F&uuml;llen eines Excel-Sheets mit den Daten eines Arrays<\/span><\/b><\/p>\n<p>Die erste Anweisung ruft gleich eine weitere Funktion namens <b>GetWorksheet <\/b>auf, die ein neues <b>Worksheet <\/b>zur&uuml;ckliefern soll. Diese finden Sie in Listing 8.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetWorksheet()<span style=\"color:blue;\"> As <\/span>Excel.Worksheet\r\n     <span style=\"color:blue;\">Dim <\/span>objWorksheet<span style=\"color:blue;\"> As <\/span>Excel.Worksheet\r\n     <span style=\"color:blue;\">If <\/span>objWorkbook Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>objExcel Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> objExcel = <span style=\"color:blue;\">New<\/span> Excel.Application\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objWorkbook = objExcel.Workbooks.Add\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objWorksheet = objWorkbook.Worksheets.Add\r\n     <span style=\"color:blue;\">With<\/span> objExcel\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .WindowState = xlMinimized\r\n         .WindowState = xlNormal\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> GetWorksheet = objWorksheet\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Initialisieren einer Excel-Instanz<\/span><\/b><\/p>\n<p>Die Funktion <b>GetWorksheet <\/b>verwendet zwei Objektvariablen, die im Modulkopf als &ouml;ffentliche Variablen deklariert werden:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>objExcel<span style=\"color:blue;\"> As <\/span>Excel.Application\r\n<span style=\"color:blue;\">Public <\/span>objWorkbook<span style=\"color:blue;\"> As <\/span>Excel.Workbook<\/pre>\n<p>Die Funktion pr&uuml;ft, ob die Variable <b>objWorkbook <\/b>mit einem Verweis auf ein <b>Workbook<\/b>-Objekt gef&uuml;llt ist. Falls nicht, pr&uuml;ft sie, ob zumindest die Variable <b>objExcel <\/b>eine Referenz zu einer <b>Excel<\/b>-Instanz enth&auml;lt. Ist Letzteres nicht der Fall, erstellt die Funktion zun&auml;chst eine neue <b>Excel<\/b>-Instanz und speichert diese in <b>objExcel<\/b>.<\/p>\n<p>Dann erstellt sie mit der <b>Add<\/b>-Methode der <b>Workbooks<\/b>-Auflistung von <b>objExcel <\/b>ein neues <b>Workbook<\/b>-Objekt und speichert es in <b>objWorkbook<\/b>. Schlie&szlig;lich f&uuml;gt sie diesem <b>Workbook<\/b>-Objekt ein neues <b>Worksheet <\/b>hinzu und referenziert dieses mit der Variablen <b>objWorksheet<\/b>.<\/p>\n<p>Schlie&szlig;lich sorgen die folgenden Anweisungen daf&uuml;r, dass die Excel-Instanz sichtbar gemacht und im Vordergrund angezeigt wird. Die Funktion gibt dann den Verweis auf das <b>Worksheet<\/b>-Objekt an die aufrufende Prozedur zur&uuml;ck.<\/p>\n<p>Damit geht es mit der Prozedur <b>OutputExcel <\/b>weiter. Diese ermittelt nun wie die zuvor beschriebenen Routinen zur Ausgabe des Array-Inhalts im Direktfenster die oberen und unteren Grenzen der Array-Dimensionen. Je nachdem, ob <b>int2Max<\/b> den Wert <b>0 <\/b>enth&auml;lt, wird entweder nur eine Dimension behandelt oder zwei Dimensionen.<\/p>\n<p>Der erste Teil der entsprechenden <b>If&#8230;Then<\/b>-Bedingung behandelt den Fall einer einzigen Dimension. In einer <b>For&#8230;Next<\/b>-Schleife durchl&auml;uft die Prozedur alle Elemente des Arrays. Dabei schreibt sie in die erste Spalte jeweils die laufende Nummer, beginnend mit dem Wert <b>1<\/b>. Dann pr&uuml;ft sie, ob das aktuelle Element des Arrays einen Wert enth&auml;lt. Falls ja, landet dieser in der zweiten Spalte der aktuellen Zeile, falls nicht, bleibt die Spalte leer. Sie k&ouml;nnen hier nat&uuml;rlich auch ein <b>x <\/b>eintragen lassen, wenn dies f&uuml;r den aktuellen Anwendungsfall sinnvoll ist.<\/p>\n<p>Wenn das Array zweidimensional ist, wird es im <b>Else<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung verarbeitet. In zwei verschachtelten <b>For&#8230;Next<\/b>-Schleifen durchl&auml;uft die Prozedur die beiden Dimensionen und tr&auml;gt die Werte entsprechend der Position im Array im Excelsheet ein.<\/p>\n<p>Schlie&szlig;lich stellt die Prozedur die Spaltenbreiten und Zeilenh&ouml;hen auf die optimalen Werte f&uuml;r die Anzeige der enthaltenen Daten ein.<\/p>\n<p><b>Ist das Array gef&uuml;llt<\/b><\/p>\n<p>Wenn der Fall eintreten kann, dass das Array, mit dem Sie arbeiten, keine Daten enth&auml;lt, dann m&ouml;chten Sie dies vielleicht erfahren, bevor der Zugriff etwa auf die <b>LBound<\/b>&#8211; oder <b>UBound<\/b>-Funktion einen Fehler liefert.<\/p>\n<p>Leider gibt es keine eingebaute Funktion, die auf ein leeres Array hinweist. Also basteln wir uns selbst eine entsprechende Funktion. Diese hei&szlig;t <b>IstArrayGefuellt <\/b>und sieht wie in Listing 9 aus.<\/p>\n<pre><span style=\"color:blue;\">Private 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><b><span style=\"color:darkgrey;\">Listing 9: Diese Funktion pr&uuml;ft, ob ein Array gef&uuml;llt ist.<\/span><\/b><\/p>\n<p>Die Funktion erwartet das zu untersuchende Array als Parameter und liefert einen <b>Boolean<\/b>-Wert zur&uuml;ck, der angibt, ob das Array gef&uuml;llt ist. Die Funktion verwendet zun&auml;chst die VBA-Funktion <b>IsArray<\/b>, um zu ermitteln, ob die Variable <b>var <\/b>&uuml;berhaupt ein Array enth&auml;lt. Falls ja, kann es sich immer noch um ein leeres Array handeln. Um dies auszuschlie&szlig;en, liest die Funktion bei deaktivierter Fehlerbehandlung den Wert von <b>LBound(var) <\/b>in die Variable <b>intTest <\/b>ein. Hat dies keinen Fehler ausgel&ouml;st, liegt ein Array mit mindestens einem Element vor, anderenfalls handelt es sich entweder um ein leeres Array oder gar kein Array.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die hier vorgestellten Funktionen k&ouml;nnen Sie bei der Arbeit mit Arrays nutzen, vor allem w&auml;hrend der Entwicklung. Damit verschaffen Sie sich schnell einen &uuml;berblick &uuml;ber den Inhalt eines Arrays &#8211; entweder durch die Ausgabe in den Direktbereich oder in eine Excel-Datei.<\/p>\n<p>Au&szlig;erdem haben Sie erfahren, wie Sie Arrays mit Daten aus Recordsets mit einem oder mehreren Feldern f&uuml;llen k&ouml;nnen.<\/p>\n<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>MitArraysArbeiten.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/2B40DABE-9394-4049-B676-C8CC25784D9A\/aiu_963.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&Uuml;ber Arrays unter VBA wurde schon vieles geschrieben und gesagt. Dennoch gibt es praktische Hinweise, die man gelegentlich ben&ouml;tigt, nicht so einfach im Internet. Also werfen wir in diesem Beitrag einen genaueren Blick auf die M&ouml;glichkeiten, die Arrays bieten, und liefern einige neue Funktionen rund um die Felder zum tempor&auml;ren Speichern und Bereitstellen von Daten. Unter anderem sehen wir uns an, wie Sie die Inhalte von Arrays zu Debugging-Zwecken im Direktbereich oder in einer Excel-Tabelle ausgeben oder wie Sie pr&uuml;fen, ob ein Array leer ist.<\/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":[662014,66062014,44000025],"tags":[],"class_list":["post-55000963","post","type-post","status-publish","format-standard","hentry","category-662014","category-66062014","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>Mit Arrays arbeiten - 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\/Mit_Arrays_arbeiten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mit Arrays arbeiten\" \/>\n<meta property=\"og:description\" content=\"&Uuml;ber Arrays unter VBA wurde schon vieles geschrieben und gesagt. Dennoch gibt es praktische Hinweise, die man gelegentlich ben&ouml;tigt, nicht so einfach im Internet. Also werfen wir in diesem Beitrag einen genaueren Blick auf die M&ouml;glichkeiten, die Arrays bieten, und liefern einige neue Funktionen rund um die Felder zum tempor&auml;ren Speichern und Bereitstellen von Daten. Unter anderem sehen wir uns an, wie Sie die Inhalte von Arrays zu Debugging-Zwecken im Direktbereich oder in einer Excel-Tabelle ausgeben oder wie Sie pr&uuml;fen, ob ein Array leer ist.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-03T18:31:55+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/e2c998674d8c4b13ba1f356bbf61980c\" \/>\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=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Mit Arrays arbeiten\",\"datePublished\":\"2022-01-03T18:31:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/\"},\"wordCount\":2482,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/e2c998674d8c4b13ba1f356bbf61980c\",\"articleSection\":[\"2014\",\"6\\\/2014\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/\",\"name\":\"Mit Arrays arbeiten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/e2c998674d8c4b13ba1f356bbf61980c\",\"datePublished\":\"2022-01-03T18:31:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/e2c998674d8c4b13ba1f356bbf61980c\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/e2c998674d8c4b13ba1f356bbf61980c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mit_Arrays_arbeiten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mit Arrays arbeiten\"}]},{\"@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":"Mit Arrays arbeiten - 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\/Mit_Arrays_arbeiten\/","og_locale":"de_DE","og_type":"article","og_title":"Mit Arrays arbeiten","og_description":"&Uuml;ber Arrays unter VBA wurde schon vieles geschrieben und gesagt. Dennoch gibt es praktische Hinweise, die man gelegentlich ben&ouml;tigt, nicht so einfach im Internet. Also werfen wir in diesem Beitrag einen genaueren Blick auf die M&ouml;glichkeiten, die Arrays bieten, und liefern einige neue Funktionen rund um die Felder zum tempor&auml;ren Speichern und Bereitstellen von Daten. Unter anderem sehen wir uns an, wie Sie die Inhalte von Arrays zu Debugging-Zwecken im Direktbereich oder in einer Excel-Tabelle ausgeben oder wie Sie pr&uuml;fen, ob ein Array leer ist.","og_url":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-01-03T18:31:55+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/e2c998674d8c4b13ba1f356bbf61980c","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Mit Arrays arbeiten","datePublished":"2022-01-03T18:31:55+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/"},"wordCount":2482,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/e2c998674d8c4b13ba1f356bbf61980c","articleSection":["2014","6\/2014","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/","url":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/","name":"Mit Arrays arbeiten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/e2c998674d8c4b13ba1f356bbf61980c","datePublished":"2022-01-03T18:31:55+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/e2c998674d8c4b13ba1f356bbf61980c","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/e2c998674d8c4b13ba1f356bbf61980c"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Mit_Arrays_arbeiten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Mit Arrays arbeiten"}]},{"@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\/55000963","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=55000963"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000963\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}