Ich arbeite mit einem dynamischen Array in Excel VBA. Die Anzahl der Spalten (m) ist festgelegt, aber ich weiß nicht, wie viele Zeilen (n) benötigt werden.
Die Hilfedokumente geben an, dass ReDim Preserve myArray (n, m) es mir erlaubt, m größer, aber nicht n zu machen. Allerdings muss ich die Anzahl der Zeilen (n) erhöhen, während meine Daten beibehalten werden, nicht die Spalten (m)!
Zum Beispiel könnte ich ein (5,20) -Array haben, das ich zu (10,20) erweitern möchte, während ich meine Daten behalte.
Es scheint, dass, wenn es eine Möglichkeit gibt, mein Array zu transponieren, ein ReDim Preserve ausgeführt wird, um die Anzahl der "Spalten" zu erweitern und dann mein Array neu zu transponieren, könnte ich erreichen, was ich will.
Ist das der richtige Weg? Wenn ja, wie kann ich das tun?
Gibt es einen besseren Weg, um das zu erreichen, was ich will?
Hat meine eigene Frage gelöst; Hier ist, wie ich mein Problem gelöst habe. Ich habe ein temporäres Array erstellt, den Inhalt von myArray in das temporäre Array kopiert, die Größe von myArray geändert und dann den Inhalt aus dem temporären Array in myArray kopiert.
%Vor%Wenn jemand einen effizienteren Weg vorschlagen kann, würde ich es gerne hören.
Eine Möglichkeit, das zu tun, was Sie wollen, ist die Verwendung eines 1-D-Arrays, das 1-D-Arrays anstelle eines 2-D-Arrays enthält. Dann können Sie ReDim das äußere Array behalten, was Sie wollen. Wenn Sie das äußere Array von einer Funktion zurückgeben, wird Excel das Richtige tun und es zu einem 2-D-Array zwingen.
Zum Beispiel gibt die folgende Funktion ein 3x2-Array an die Zellen zurück, von denen es aufgerufen wird:
%Vor%Meine Antwort auf diese Fragen könnte Ihnen auch nützlich sein: Übergeben Sie ein mehrdimensionales Array in Excel-UDF in VBA und VBA fügt 3-dimensionales Array in ein Blatt ein
Natürlich, wenn Sie das nicht von einem UDF zurückgeben, müssen Sie es selbst erzwingen. Eine einfache Möglichkeit, dies zu tun, ohne Schleifencode zu schreiben, ist dies:
%Vor%Dies ruft nur die eingebaute INDEX-Funktion von Excel auf, und die Nullen bedeuten, dass Sie alle Zeilen und alle Spalten zurückgeben möchten. Excel wird Ihr 1-D-Array von 1-D-Arrays automatisch zu einem 2-D-Array zwingen. (Achtung: es gibt einige Größenbeschränkungen, aber sie sind viel größer als 10x20.)
Wenn Sie Entwickler sind - was ist der Unterschied zwischen Zeilen und Spalten? Die Verwendung von Array (N, 2) (wenn Sie 2 Spalten haben) entspricht Array (2, N) - für die Sie
können %Vor%Und der Unterschied für Sie (als Entwickler) wird sein, die Variable aus dem Zyklus an die zweite statt an die erste Stelle zu setzen:
%Vor%Oder Sie wollen das:
%Vor%Was ist der Unterschied?
Eine Möglichkeit, wie Sie es verschieben können, ist in der Tat eine doppelte Transponierung mit einer Änderung der Anzahl der Spalten dazwischen. Dies funktioniert jedoch nur für zweidimensionale Arrays. Es ist wie folgt gemacht:
%Vor% Natürlich können m
und n
wie folgt abgeleitet werden:
Sie verwenden also die integrierte Transponierungsfunktion von Excel selbst. Wie in den Code-Kommentaren erwähnt, funktioniert dies nicht für Matrizen höherer Ordnung.
Das Wort "transpose" springt sofort in den Sinn. Sie können einfach Daten in das 2D-Array eingeben, indem Sie die Spalten und Zeilen spiegeln (d. H. Transponieren). Dadurch können Sie n (jetzt die Anzahl der Spalten, aber die Zeilenwerte speichern) bei Bedarf größer machen.
Um die Werte zu referenzieren, sagen Sie in einer Doppelschleife, tauschen Sie die Indizes um. Z.B. gehe eher von i = 1 nach n und j = 1 nach m, wo du auf den Wert (i, j) beziehst, benutze i = 1 bis m und j = 1 bis n.
Sie können die Anzahl der Elemente in der ersten Dimension nicht ermitteln? Bummel. Für ein zweidimensionales Array mit einer festen zweiten Dimension möchten Sie vielleicht stattdessen ein Array von Typen ("Strukturen" in anderen Sprachen) erstellen. Dadurch können Sie Redim Preserve verwenden, und Sie haben immer noch eine sinnvolle Möglichkeit, Werte hinzuzufügen und darauf zuzugreifen, obwohl Sie nun als benannte Elemente des Typs auf die zweite Dimension zugreifen und nicht auf Indexwerte.
Coercing oder Slicing scheint nicht mit Index (oder Match (Index) zu funktionieren (wenn ich Array (ohne Schleifen) basierend auf mehreren Kriterien filtern möchte, wenn die Größe der Daten mehr als 2 ^ 16 Zeilen umfasst (~ 92000 Zeilen).
%Vor%Transpose funktioniert nicht mit großen Recordsets und so funktioniert auch Double Transpose nicht. Gibt es nicht sowieso ein Array zu filtern und Daten zu greifen, ohne auf mehrere Schleifen zurückgreifen zu müssen?
Ich denke daran, das Wörterbuch Weg oder ADO mit Excel zu versuchen.
Ein Array mit 2 Dimensionen, in dem die Anzahl der Spalten festgelegt ist und die Anzahl der Zeilen dynamisch ist, kann wie folgt erstellt werden:
%Vor%TempValue Lesen von Zellen A1: A10, wenn es einen Wert in der Zelle Ax gibt, wird das Array mit + 1 redimiert und Tempvalue zum Array col1 hinzugefügt, Inhalt in Bx zum Array col2 und Inhalt in Cx zum Array col3 hinzugefügt. Wenn die Länge des Ax-Werts 0 ist, fügt es dem Array nichts hinzu.
Debug.print zeigt Ergebnisse im "unmittelbaren Fenster" im VB-Editor.
Ohne die Testlinien und Hinzufügen eines dynamischen Datenbereichs kann der Code sein:
%Vor%