Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Array auslesen

Betrifft: Array auslesen von: Stefanie
Geschrieben am: 20.10.2014 07:58:05

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

  

Betrifft: Das Array könnte mehrspaltig und -zeilig sein, ... von: Luc:-?
Geschrieben am: 20.10.2014 08:34:41

…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 :-?


  

Betrifft: AW: Das Array könnte mehrspaltig und -zeilig sein, ... von: Stefanie
Geschrieben am: 20.10.2014 11:15:31

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


  

Betrifft: Du durchläufst ein Array Zeile für Zeile und ... von: Luc:-?
Geschrieben am: 20.10.2014 12:20:12

…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 :-?


  

Betrifft: AW: Du durchläufst ein Array Zeile für Zeile und ... von: Stefanie
Geschrieben am: 21.10.2014 13:01:30

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


  

Betrifft: ...Es ist aber auch nicht so schwer, ... von: Luc:-?
Geschrieben am: 21.10.2014 16:54:08

…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 :-?


 

Beiträge aus den Excel-Beispielen zum Thema "Array auslesen"