Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1024to1028
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Variant Arrays

Variant Arrays
19.11.2008 19:08:00
windalf
Hallo,
ist es möglich "einfach Variantarrays" aneinander zu ketten oder muss man sich das selber basteln?
Dim ws_source As Worksheet
With ws_source
vntArray = .Range(.Cells(2, 1), .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).Value
End With
angenommen ich habe mehrere worksheets gleicher Art und will deren Inhalt hintereinander in das vntArray packen... Wie macht man das am einfachsten.
Was ich mir so vorstellen würde wäre sowas komfortables wie vntArray = vntArray + ...
Geht da was automatische mit füge was an oder wie macht man das am geschicktesten in VBA
Danke Gruß Windi...

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Variant Arrays
19.11.2008 19:37:50
Beverly
Hi Windi,
meinst du das so:

vntArray = Array(Worksheets("Tabelle1").Range("A1:A5"), Worksheets("Tabelle2").Range("B1:B3"))




AW: Variant Arrays
19.11.2008 20:46:00
windalf
Hallo Karin,
vielen Dank für die Antwort.
Mein Problem ist, dass ich das dynamisch brauche, da ich vorher nicht weiß wieviele Worksheets es sein werden...
Daher hatte ich gehoft es gäbe so etwas wie "konkateniere Array 1 und Array2".
Das könnte ich dann in einer Schleife in der Art vntArray = vntArray + ... aufrufen...
Anzeige
AW: Variant Arrays
19.11.2008 21:00:00
Daniel
Hi
ich würde erst jedes einzelne Sheet in ein eigenes Variant-Array einlesen und dann per Schleife zusammenfügen.
beim Umgang im Arrays ist VBA schnell genug, um das in einer Schleife durchführen zu können, eine spezielle Funktion dazu ist mir nicht bekannt (was natürlich nicht heißen muss, daß es sie nicht gibt).
also etwa in dem Stil:

Dim arr1, arr2, arrAlle
dim sp as long
dim ze as long
dim i as long
arr1 = sheets("Tab1").usedrange.value
arr2 = sheets("Tab2").usedrange.value
redim arrAlle(1 to Ubound(arr1,1)+Ubound(arr2,1), 1 to worksheetfunction.max(ubound(arr1,2),  _
Ubound(arr2,2))
i = 0
for ze = 1 to ubound(arr1,1)
i = i + 1
for sp = 1 to ubound(arr1,2)
arrAlle(i, sp) = arr1(ze,sp)
next
next
for ze = 1 to ubound(arr2,1)
i = i + 1
for sp = i to Ubound(arr2,2)
arrAlle(i, sp) = arr2(ze,sp)
next
next


Gruß, Daniel

Anzeige
AW: Variant Arrays
19.11.2008 22:01:00
windalf
Hi Daniel,
vom Prinzip her würde ich es ähnlich wie du machen (allerdings war es ja mein Ziel genau das nicht machen zu müssen :-) ). Auchwürde ich bei einer unbestimmten Anzahl von Arrays dazu neigen nur "ein Hauptarray" zu haben, das jeweils mit Redim Preserve anzupassen und immer das neue Array zwischenzupuffern statt erst alles in verschiedene einzulesen.
Was spricht denn für deine vorgehensweise und ggf. gegen meine. Bei deinem Vorschlag müsste ich ja erstens mehr Speicher vorhalten und zweitens ein Array von Arrays verwalten.
In meinem Falle käme eine ständige Redimensionierung zum tragen.
Was spricht gegen meine Vorgehensweise?
Gruß Windi
Ah by the way hätte ich da noch eine Frage. Wie löscht man eigentlich möglichst elegant eine Zeile aus dem Array. In der ersten stehen ja meist genau überschriften die man gar nicht (oder maximal einmal) haben will. Meine vorgehensweise war bisher immer gar nicht erst "den Müll den man nciht haben will" einlesen. In deinem Beispiel bist du ja direkt auf usedrange gegangen. Gibt es da noch einen "einfach Einzeilertrick" die unerwünschten Überschriften zu bereinigen?
Anzeige
AW: Variant Arrays
19.11.2008 22:32:49
Uduuh
Hallo,
das kannst du nur in einer Schleife zusammenfügen.
Die ständige ReDimerei solltes du aber umgehen, indem du erst mal feststellst, wie groß das Array wird. ReDim frist Zeit.
Motto:

for i=1 to worksheets.count
iMax=Worksheets(i).usedrange.rows.count+iMax
Next
Redim myArray(1 to iMax-Worksheets.count+1, 1 to Worksheets(1).usedrange.columns.count)


und dann das Array füllen


for i=1 to worksheets.count
arrTmp=worksheets(i).usedrange
for j= 2+(i=1) to ubound(arrTmp)
n=n+1
for k=1 to ubound(myarray,2)
myarray(n,j)=arrtmp(j,k)
next k
next j
next i


Ist alles andere ls zeitkritisch
Gruß aus’m Pott
Udo

Anzeige
AW: Variant Arrays
19.11.2008 23:00:00
Daniel
Hi
keine Ahnung was besser ist, wenn beides funktioniert, kannst du ja mal testen, was schneller geht.
allerdings würde ich auch versuchen, erstmal festzustellen, wie gross das gesamtarray überhaupt sein muss, um nur einmal zu dimensionieren.
Das ReDim hat außerde, den Nachteil, daß es nur in der jeweils letzten Dimension funktioniert (hier Spalten), dh du musst immer Zeilen- und Spaltevertauscht denken und bei einem eventuellen Rückschreiben erst mit Worksheetfunction.Transpose Zeilen gegen Spalten tauschen.
was die überschriften angeht, kann ich nur sagen, da du das in der Eingangsfrage nicht erwähnt hast, bin ich da nicht näher darauf eingeangen, sondern hab nur einfachst möglich ein brauchbares Marko zusammengebastelt.
wenn du bei den 2. Arrays die Überschrift weglassen willst, dann lässt du die For-Schleife einfach erst bei 2 oder 3 (je nach Anzahl der überschriftenzeilen) beginnen und nicht bei 1.
Gruß, Daniel
ums nochmal zu erwähnen: Anworten gibts normalerweise nur auf Fragen die gestellt wurden und nicht auf Probleme, die der Fragesteller nur im Hinterkopf, aber nicht erwähnt hat.
Anzeige
AW: Variant Arrays
20.11.2008 13:11:00
windalf
[quote]
ums nochmal zu erwähnen: Anworten gibts normalerweise nur auf Fragen die gestellt wurden und nicht auf Probleme, die der Fragesteller nur im Hinterkopf, aber nicht erwähnt hat.
[/quote]
Naja "das Problem" kam ja erst dadurch auf, dass es eben anscheinend keine wie von mir gewünschte Funktionatlität zur Verkettung von Arrays in VBA gibt.
Zum Zeitpunkt meiner Frage war dieser Teil der Informationen ja noch irrelevant. Relevant wurde der ja erst, als sich das Thema in die von mir "ungewünschte Richtigung" (ungewünscht meint nicht die Antworten an sich, sondern dass es anscheinend keine bereits implementierte Funktionalität für die Verkettung gibt) entwickelt hat...
Aber OK Frage ist geklärt. "Gebastelt bekomme ich das schon problemlos hin." Man stellt nur bei der implementiererei immer wieder fest, dass man das Rad öfter neu erfindet. Das wollte ich nur vermeiden und fragen ob es so etwas schon gibt.
Danke für alle Tipps
Gruß Windi...
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige