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

Array auf einmal Pasten

Forumthread: Array auf einmal Pasten

Array auf einmal Pasten
25.07.2024 11:15:00
Theo
Hallo zusammen,

mir ist das fast schon ein bisschen peinlich, obwohl ich schon seit Jahren mit VBA arbeite, habe ich bisher eigentlich nie mit Arrays arbeiten müssen und fühle mich deswegen in diesem Bereich noch etwas planlos.
In meinem gegenwärtigen Projekt liste ich mehr als eine Millionen Einträge auf, was beim klasssischen zellenweisen Schreiben einfach zu langsam ist. Ich hatte deshalb die "brilliante" Idee, die Einträge erst einmal in ein Array zu schreiben und dann das Array auf einmal in die Tabelle zu schreiben. Das funktioniert auch in meiner Anwendung relativ fix, allerdings stehen im Anschluss nicht die erwarteten Werte in der Tabelle. Obwohl jeder Eintrag des Arrays unterschiedliche Werte enthält, steht in meinem Ergebnis in jder Zeile immer nur der erste (Index =0) eintrag des Arrays. Untenstehender Code zeigt wie ich das befüllte Array zurückschreibe. Das Befüllen des Arrays ist hier nur exemplarisch. Laut Watchwindow ist es auf jeden Fall korrekt befüllt.

Was mache ich falsch:
Sub ArrayProblem()

Dim myArr() As Variant
Dim i As Long
Dim NoOfElementsInArray As Long
Dim ElemCount As Long
Dim ElemUBound As Long

'Dies simuliert wie das Array Befüllt wird
For i = 0 To 1000 ' Die Anzahl der Einträge ist variabel - zur veranschaulichung 1000
ElemCount = ElemCount + 1
If ElemCount > ElemUBound Then
ElemUBound = 2 * ElemCount
ReDim Preserve myArr(ElemUBound)
End If

myArr(i) = "testfile_" & i & ".pdf"
Next i

'jetzt ist das array also folgendermassen befüllt:
'myArr(0)= "testfile_0.pdf"
'myArr(1)= "testfile_1.pdf"
'myArr(2)= "testfile_2.pdf"
'...
'myArr(1000)= "testfile_1000.pdf"


'Ermittel die Größe des Arrayss
NoOfElementsInArray = UBound(myArr)

'Zurückschreiben in Zelle B17 des activesheet
ActiveSheet.Range("B17:B" & 17 + NoOfElementsInArray) = myArr

'erwartet sollten jetzt folgende Werte in den Zellen stehen
'B17: testfile_0.pdf
'B18: testfile_1.pdf
'B19: testfile_2.pdf....

'tatsächlich steht da jetzt aber:
'B17: testfile_0.pdf
'B18: testfile_0.pdf
'B19: testfile_0.pdf....
End Sub


Danke schon mal für Eure Hilfe!

Theo
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array auf einmal Pasten
25.07.2024 11:23:28
Oppawinni
Da wirst du dein Array wohl transportieren müssen
AW: Array auf einmal Pasten
25.07.2024 11:28:57
Theo
Hallo Oppawinni,

vielen Dank, das hat mir GenAI auch gerade gesagt :-)
Das funktioniert zwar indem ich

ActiveSheet.Range("B17:B" & 17 + NoOfElementsInArray) = myArr 

durch
ActiveSheet.Range("B17:B" & 17 + NoOfElementsInArray) = Application.Transpose(myArr)

ersetzte, ich habe aber irgendwo gelesen, dass Transpose bei großen Arrays probleme macht.
Gibt es noch eine andere Lösung?

Danke
Anzeige
AW: Array auf einmal Pasten
25.07.2024 11:34:39
ralf_b
du könntest dein Array gleich in der Form ar(1,1) aufbauen, statt es eindimensional zu erstellen ar(1)

um das nachzuvollziehen schreib doch mal einen Zellbereich in eine Variant Variable und schau dir an wie diese dann aufgebaut ist.
AW: Array auf einmal Pasten
25.07.2024 11:36:54
Theo
Ich glaube ich habs jetzt:

Sub ArrayProblem()

Dim myArr() As Variant
Dim i As Long
Dim NoOfElementsInArray As Long
Dim ElemCount As Long
Dim ElemUBound As Long
Dim ws As Worksheet
Dim pasteRange As Range
Dim outputArr() As Variant

'Dies simuliert wie das Array Befüllt wird
For i = 0 To 1000 ' Die Anzahl der Einträge ist variabel - zur veranschaulichung 1000
ElemCount = ElemCount + 1
If ElemCount > ElemUBound Then
ElemUBound = 2 * ElemCount
ReDim Preserve myArr(ElemUBound)
End If

myArr(i) = "testfile_" & i & ".pdf"
Next i

'jetzt ist das array also folgendermassen befüllt:
'myArr(0)= "testfile_0.pdf"
'myArr(1)= "testfile_1.pdf"
'myArr(2)= "testfile_2.pdf"
'...
'myArr(1000)= "testfile_1000.pdf"

Set ws = ActiveSheet
Set pasteRange = ws.Range("B17").Resize(UBound(myArr) - LBound(myArr) + 1, 1)

'Schreibe den Inhalt des Arrays in einen Range
ReDim outputArr(1 To UBound(myArr) - LBound(myArr) + 1, 1 To 1)

For i = LBound(myArr) To UBound(myArr)
outputArr(i - LBound(myArr) + 1, 1) = myArr(i)
Next i

pasteRange.Value = outputArr
Set ws = Nothing
End Sub


Trotzdem Danke an Euch alle!

Theo
Anzeige
;

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