Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Array auslesen

Array auslesen
20.10.2014 07:58:05
Stefanie
Hallöle,
ich weis leider nicht wie ich mein Array auslese(folgendermaßen definiert):
 For lZeile = 1 To UBound(arr) 'alle Zeilen
For lSpalte = 1 To UBound(arr, 2) 'alle Spalten
If arr(lZeile, lSpalte) = "x" Then
arraytxt(z, zz) = Cells(3, lSpalte + 1)
MsgBox arraytxt(z, zz)
z = z + 1
zz = zz + 1
End If
Next lSpalte
Next lZeile

Also wenn im Array ein x gefunden wurde dann soll er mir eine bestimmte Zelle ausgeben, das ist jedoch jetzt nicht so wichtig denke ich. Mein Problem:
Wie lese ich jetzt den Array (arraytxt) aus und schreibe die einzelnen Werte des Array nacheinander in eine Spalte?
Googel hat mir leider bisher nicht weitergeholfen, hoffe ich finde hier Hilfe!
Danek euch

Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Das Array könnte mehrspaltig und -zeilig sein, ...
20.10.2014 08:34:41
Luc:-?
…Stefanie,
also eine Matrix abbilden. In welcher Form soll es dann in nur eine Spalte übertragen wdn, Spalte nach Spalte oder Zeile zu Spalte für Zeile zu Spalte, also entweder spalten- oder zeilenweise? Oder meinst du evtl doch einen 1:1-Bereich aus Zeilen und Spalten? Ansonsten gehst du ja ohnehin das ganze Array Element für Element durch, da kannst du auch gleich noch die Ausgabe in eine korrespondierende Zelle mit einbauen.
Gruß, Luc :-?

Anzeige
AW: Das Array könnte mehrspaltig und -zeilig sein, ...
20.10.2014 11:15:31
Stefanie
Hallo Luc erstmal vielen Dank für deine Antwort.
Ich geben mein Array quasi zeilenweise aus.
Also ich durchlaufe alle Wert in meinem Array und diese Werte kommen dann z.B., in Spalte B untereinander Zeile für Zeile in die entsprechende Spalte.
Dazu will ich dann noch gleiche Werte Verbinden aber das ist dann der näcshte Schritt :-)
Danke dir

Anzeige
Du durchläufst ein Array Zeile für Zeile und ...
20.10.2014 12:20:12
Luc:-?
…jede Zeile dann Spalte für Spalte, Stefanie;
dabei suchst du nach 'x' und liest dann in ein 2.Array den Wert einer korrespondierenden Spalte aus Zeile 3 des Blattes ein. Dieses 2.Array enthält dann letztlich genausoviel Zeilen und Spalten wie insgesamt x gefunden wurden, bildet also eine quadratische Matrix mit nur je einem Wert pro Zeile und Spalte, de facto in ihrem Schnittpunkt. Diesen Wert kannst du entweder gleich wieder in einen korrespondierenden Bereich des Blattes ausgeben (dazu musst du nur die Indizes z u. zz zu den Indizes der Startzelle dieses Bereichs addieren) oder die ganze Matrix ganz zum Schluss, was schneller wäre.
Würdest du das 1.Array in nur einem Zyklus mit For Each durchgehen, könnte das 2.Array auch sehr einfach nur aus einer Zeile oder Spalte bestehen, was ggf auch deine ursprüngliche Absicht war, aber durch die Verwendung von jeweils 2 stets gleichen* IndexWerten für das 2.Array nicht erreicht wird.
Deine Absichten kenne ich natürlich nicht, sondern kann nur den TatBestand feststellen.
Ein Array gibt man auf 1× in einen ZellBereich aus, indem man dessen StartZelle auf die erforderliche Größe Resizet und ihm das ganze Array auf 1× zuweist, zB für den durch dein Makro geschaffenen TatBestand so: zielZelle.Resize(z, zz) = arraytxt
Falls es aber doch nur eine Zeile/Spalte wdn sollte, darf letztlich der dementsprd Parameter fehlen und nur der jeweils andere muss angegeben wdn, also für einen einzelnen Index (z), was einem ZeilenVektor entspräche, .Resize(, z), für einen Index (z, 1) ⇒ SpaltenVektor dann .Resize(z). Dieser Fall trifft auch zu, falls ein ZeilenVektor auf eine Spalte abgebildet wdn soll, nur muss es dann zielZelle.Resize(z) = WorksheetFunction.Transpose(arraytxt) heißen.
* Weil du stets beide erhöhst!
Luc :-?

Anzeige
AW: Du durchläufst ein Array Zeile für Zeile und ...
21.10.2014 13:01:30
Stefanie
Du hast es ganz genau erfasst :-)
stimm das eine Array muss nicht mal 2 dmensional sein.. weil ich ja nur wenn ein x gefunden wurde einen Text in dem Array speichern will (gleiche Spalte, Zeile3)
Könntest du mir vielleicht zeigen wie es richtig aussehen würde? Mit dem 2 Array? Benötige ich dann nur ein z oder als index?
So richtig check ich das noch nicht :-(
Ich merke (und bin sehr dankbar) du hast dir sichtlich Mühe gegeben mit der Erklärung. leider muss ich, besonderes den unteren Teil, jetzt nochmal ganz ion Ruhe lesen.
Das mit den Arrays ist doch nicht so einfach wie ich dachte :-)
VG
Stefanie

Anzeige
...Es ist aber auch nicht so schwer, ...
21.10.2014 16:54:08
Luc:-?
…Stefanie,
man wuss nur wissen, was man tut und wie sie aufgebaut sind/wdn. ;-)
In deinem Fall könnte man wahrscheinlich auch noch anders vorgehen, aber das lassen wir jetzt mal weg…
Wieviel Indizes du für dein 2.Array verwendest, hängt davon ab, ob es von vornherein ein Zeilen- oder ein SpaltenVektor (oder eben eine Matrix) sein soll. Hierbei gibt es einen gravierenden Unterschied zwischen ZellBereichen (Ranges) und Datenfeldern (Arrays). Erstere sind immer 2dimensional, haben also, egal ob 1 Zeile, Spalte oder mehrspaltig und -zeilig, stets 2 Indizes. Demggüber kommt die einfachste Form eines Datenfelds mit nur einem Index aus (stets ein ZeilenVektor). Zur Ausrichtungs­Unterscheidung haben dann SpaltenVektoren 2 Indizes → der 2. ist permanent =0 (oder 1). Falls du so vorgehen möchtest, weil du das 2.Array auf eine TabSpalte abbilden willst, solltest du nur z erhöhen und anstelle von zz stets 0 eintragen (das 2.Array sollte dann auch so deklariert wdn. Ein nachträgliches ReDimmen auf die erforderliche Größe ist nur 1malig möglich, da beim 2.Mal nur noch die letzte Dimension geändert wdn kann, die hier aber 0 sein muss.
Auf den 2.Index kannst du ganz verzichten (was ich empfehle), wenn du das 2.Array als ZeilenVektor (also horizontal ausgerichtet) aufbaust. Falls du seine Daten dann trotzdem auf eine BlattSpalte abbilden willst, musst du nach Durchlauf der Schleifen zielZelle.Resize(z) = WorksheetFunction.Transpose(arraytxt) schreiben. Mit Resize wird die eine angegebene zielZelle auf einen SpaltenBereich erforderlicher Größe ausgeweitet (da z mit 0 beginnt und stets nach der WertÜbernahme um 1 erhöht wird, ist es nach ZyklenDurchlauf auch =UBound(arraytxt)+1, was exakt der Anzahl der Zeilen entspricht, auf die der Bereich ausgedehnt wdn muss. Transpose (xlFkt MTRANS) wandelt dann den Zeilen- in einen SpaltenVektor um.
Du kämst aber auch mit nur einem Zyklus („Schleife“) aus, wenn du For Each xW In arr schreiben würdest (xW müsste As Variant deklariert wdn!). Dann könnte so nach x gefragt wdn: If xW = "x" Then
arraytxt(z) ergäbe sich dann zwar wie bisher, nur müssten lZeile und lSpalte separat erhöht wdn und Letzteres in Abhängigkeit von UBound(arr, 1), also der ZeilenAnzahl von arr, da ein Datenfeld standardmäßig spaltenweise durchlaufen wird (also erst alle Zeilen der 1., dann der 2.Spalte usw). Die ErhöhungsAnweisung (am ZyklusEnde vor Next) müsste dann folglich …
lZeile = lZeile + 1: lSpalte = lSpalte + Abs(lZeile Mod UBound(arr, 1) = 0)
…lauten. Da lZeile hier flfd erhöht wird, ist es auch nur für diesen Zweck nutzbar.
Aber das ist nur eine idR schnellere Alternative, die du nicht unbedingt nutzen musst… ;-)
Gruß, Luc :-?
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Array auslesen in Excel VBA


Schritt-für-Schritt-Anleitung

Um ein Array in Excel VBA auszulesen und die Werte in eine Spalte zu übertragen, kannst Du folgende Schritte befolgen:

  1. Array definieren: Zuerst musst Du sicherstellen, dass Dein Array korrekt definiert ist. Hier ist ein Beispiel:

    Dim arr(1 To 3, 1 To 3) As Variant
    arr(1, 1) = "x"
    arr(1, 2) = "y"
    arr(1, 3) = "x"
    arr(2, 1) = "x"
    arr(2, 2) = "z"
    arr(2, 3) = "x"
    arr(3, 1) = "a"
    arr(3, 2) = "b"
    arr(3, 3) = "c"
  2. Neues Array erstellen: Erstelle ein zweites Array, um die Werte zu speichern, die Du aus dem ersten Array extrahierst.

    Dim arraytxt() As Variant
    Dim z As Long
    Dim zz As Long
    ReDim arraytxt(1 To 9) ' Beispiel für max. 9 Elemente
    z = 1
  3. Array auslesen: Durchlaufe das ursprüngliche Array und speichere die Werte in arraytxt, wenn das Element "x" ist.

    For lZeile = 1 To UBound(arr, 1)
       For lSpalte = 1 To UBound(arr, 2)
           If arr(lZeile, lSpalte) = "x" Then
               arraytxt(z) = Cells(3, lSpalte + 1) ' Beispielzelle
               z = z + 1
           End If
       Next lSpalte
    Next lZeile
  4. Werte in eine Spalte schreiben: Übertrage die Werte aus arraytxt in eine Excel-Spalte.

    Range("B1").Resize(z - 1, 1) = Application.Transpose(arraytxt)

Häufige Fehler und Lösungen

  • Fehler: "Typenkonflikt" beim Zuweisen von Werten.

    • Lösung: Stelle sicher, dass die Daten, die Du in das Array überträgst, kompatibel sind. Verwende Variant, um unterschiedliche Datentypen zuzulassen.
  • Fehler: Das Array ist nicht ausreichend dimensioniert.

    • Lösung: Überprüfe die Dimensionen des Arrays und passe die ReDim Anweisung entsprechend an.

Alternative Methoden

Eine alternative Methode zum Auslesen eines Arrays wäre die Verwendung von For Each Schleifen. Hier ein Beispiel:

Dim xW As Variant
Dim arraytxt() As Variant
Dim z As Long
z = 1

For Each xW In arr
    If xW = "x" Then
        ReDim Preserve arraytxt(1 To z)
        arraytxt(z) = Cells(3, lSpalte + 1) ' Beispielzelle
        z = z + 1
    End If
Next xW

Diese Methode kann die Lesbarkeit erhöhen und ist oft effizienter.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie Du Arrays in Excel VBA effektiv auslesen kannst:

  1. Einfaches Array: Wenn Du nur ein eindimensionales Array hast, kannst Du es direkt in eine Spalte übertragen:

    Dim myArray() As Variant
    myArray = Array("A", "B", "C")
    Range("A1").Resize(UBound(myArray) + 1, 1) = Application.Transpose(myArray)
  2. Mehrdimensionales Array: Bei mehrdimensionalen Arrays kannst Du die Werte nach Zeilen oder Spalten übertragen:

    Dim myArray(1 To 2, 1 To 3) As Variant
    myArray(1, 1) = "X"
    myArray(1, 2) = "Y"
    myArray(1, 3) = "Z"
    
    Range("A1").Resize(2, 3) = myArray

Tipps für Profis

  • Verwendung von Application.Transpose: Denke daran, dass Application.Transpose nützlich ist, wenn Du ein Zeilenarray in eine Spalte umwandeln möchtest.

  • Fehlerbehandlung: Implementiere Fehlerbehandlung, um sicherzustellen, dass Dein Code auch bei unerwarteten Eingaben robust bleibt.

  • Effizientes Speichern: Vermeide die Verwendung von ReDim Preserve innerhalb von Schleifen, da dies die Leistung beeinträchtigen kann. Versuche stattdessen, die Größe des Arrays vor der Schleife festzulegen, wenn möglich.


FAQ: Häufige Fragen

1. Wie kann ich ein mehrdimensionales Array in Excel VBA erstellen? Du kannst ein mehrdimensionales Array mit der Dim Anweisung definieren, z.B. Dim arr(1 To 5, 1 To 5) As Variant.

2. Was ist der Unterschied zwischen einem Array und einem Range in Excel? Ein Array ist ein in VBA definiertes Datenfeld, das mehrere Werte speichert. Ein Range ist ein Zellbereich in Excel, der in der Regel immer 2-dimensional ist und direkt mit Excel-Zellen verknüpft ist.

3. Wie kann ich die Größe eines Arrays dynamisch ändern? Du kannst die Größe eines Arrays mit der ReDim Anweisung ändern. Wenn Du die vorhandenen Werte beibehalten möchtest, verwende ReDim Preserve.

4. Was ist der Vorteil der Nutzung von Arrays in VBA? Arrays ermöglichen es, mehrere Werte effizient zu speichern und zu verarbeiten, was besonders bei großen Datenmengen die Leistung von VBA-Makros erhöht.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige