Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1872to1876
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

2D-Array in Range kopieren

2D-Array in Range kopieren
16.03.2022 10:31:31
Sven
Hallo zusammen
ich habe eine Tabelle mit etwas über 18'000Zeilen und 40Spalten. Um diese zu bearbeiten, habe ich sie in ein Array kopiert und das funktioniert auch Anstandslos. Nach getaner Arbeit, soll das Array (natürlich) wieder zurück in die Excel geschrieben werden. Hier fängt das Problem an. Ich bekomme hier immer einen Fehler 1004.
Mein Vorgehen ist, das Array mit einem Befehl, so sollte es angeblich möglich sein, wieder in Excel zu übertragen:
Bsp.: Range(A1, AU18125) = arr_owssvr
'Array kopieren
tempString = "A2:" & Sit(TabellenGroesseX) & TabellenGroesseY
arr_owssvr = Range(tempString)
...Do stuff
'Array zurückschreiben
tempString = "A2:" & Sit(TabellenGroesseX) & TabellenGroesseY
Range(tempString).Value = arr_owssvr
Kann mir jemand sagen, warum dies nicht funktioniert?
Ist es möglich, dass die Tabelle/das Array einfach zu gross dafür ist?
Ich habe mit dem Code ein wenig herumgespielt und dabei hatte ich einmal das Ergebnis, dass ca. 3000 Zeilen übertragen wurden und danach dann der Fehler 1004 kam.
Zeilenweise das Array in Excel zurückschreiben funktioniert zwar, aber ist unendlich langsam...
Gruss
Tri

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 2D-Array in Range kopieren
16.03.2022 10:40:00
Yal
Hallo Sven / Tri,
Ein Excel-Blatt ist auch ein Array. Wenn Du den Bildschirmaktualisierung stoppt, hast fast dieselbe geschwindigkeit wie eine Array, insbesonders wenn Du die Daten anschliessend in das Blatt reinbringst.
Ohne den vollständigen Code zu haben, ist es schwierig eine Diagnose zu machen (WTF ist "Sit(..)"?)
Range(A1, AU18125) kann nur falsch sein, es sei denn, Du hast 2 Variablen, die A1 und AU18125 heissen wurden (worauf ich Dir dann auf bescheuerten Variablen-Namensgebung aufmerksam machen würde ;-)
Range("A1:AU18125") wäre richtig.
Copy-Paste den Code in Beitrag. Benutze "Zitat <pre>".
VG
Yal
Anzeige
AW: 2D-Array in Range kopieren
16.03.2022 10:52:54
Sven
Hallo Yal
Ja, bei dem Beispiel habe ich die "" unterschlagen... soll (hoffentlich!) nicht mehr vorkommen.
"Sit" ist "Spaltenzahl in Text". Also wandle einen Integer in den entsprechenden Text dafür um, also zB. 2 -> "B"

Dim arr_owssvr As Variant, arr_owssvrItem As Variant
TabellenGroesseX = Cells(1, Columns.Count).End(xlToLeft).Column
TabellenGroesseY = Cells(Rows.Count, 1).End(xlUp).Row
'Array kopieren
tempString = "A2:" & Sit(TabellenGroesseX) & TabellenGroesseY
arr_owssvr = Range(tempString)
'Array bearbeiten
'Array wieder zurückschreiben.
tempString = "A2:" & Sit(TabellenGroesseX) & TabellenGroesseY
Range(tempString).Value = arr_owssvr
'Test
'For i = LBound(arr_owssvr, 1) To UBound(arr_owssvr, 1)
'    For j = 1 To TabellenGroesseX
'        Cells(i, j) = arr_owssvr(i, j)
'    Next j
'Next i

Public Function Sit(iNr As Integer) 'Sit = Spaltenzahl in Text
Sit = Left(Cells(1, iNr).Address(0, 0), 1 - (iNr > 26))
End Function
Gruss
Sven
Anzeige
AW: 2D-Array in Range kopieren
16.03.2022 11:52:58
Yal
Hmm...
eigentlich, solang es keine Änderungen an TabellengrösseX und Y gibt, sollte es kein Problem geben.
Hast Du besondere Formatierung im Blatt? u.a. Gruppierte Zellen?
Ich komme nicht drauf. Einige Tipps, um die Suche zu helfen:
_ setze die Variabledeklaration als erforderlich ("Extras", "Optionen"). Mag lästig wirken, ist aber Profi-Tipp.
_ Manche Variable habe nicht sprechenden Namen "tempString", andere "übersprechende" Namen "TabellenGroesseX". Lieber überall gleich sprechend
_ Lass in Schritt-Modus beim offene Lokalfenster ("Ansicht", "Lokalfenster"), da siehst Du die Variablen-Zustände
_ Überwachungsausdruck bei Bedarf verwenden
_ Debug.Print, um Zwischenstände festzuhalten (drückt was im Direktfenster raus, Strg+g oder Ansicht Direktfenster):

Dim arr_owssvr As Variant
Dim arr_owssvrItem As Variant
Dim Adresse As String
Dim Tab_X As Long
Dim Tab_Y As Long
Tab_X = Cells(1, Columns.Count).End(xlToLeft).Column
Tab_Y = Cells(Rows.Count, 1).End(xlUp).Row
'Array kopieren
Adresse = "A2:" & Sit(Tab_X) & Tab_Y
Debug.Print Adresse, Tab_X, Sit(Tab_X), Tab_Y
arr_owssvr = Range(Adresse)
'Array bearbeiten
'Array wieder zurückschreiben.
Adresse = "A2:" & Sit(Tab_X) & Tab_Y
Debug.Print Adresse, Tab_X, Sit(Tab_X), Tab_Y
Range(Adresse).Value = arr_owssvr
VG
Yal
Anzeige
AW: 2D-Array in Range kopieren
16.03.2022 13:28:47
Sven
Hallo Yal
Danke Dir. Werde in Zukunft darauf achten. Ich gehe momentan davon aus, dass die Tabelle zu gross / zu Umfangreich ist und es einen Fehler in Excel gibt...
Werde jetzt erstmal ausprobieren, was beim abschalten des ScreenUpdate passiert, bzw. wieviel schneller die Operation wird.
Gruss
Sven
AW: 2D-Array in Range kopieren
16.03.2022 15:23:33
Sven
Hoi Yal
möchte noch etwas fragen: wenn ich die Bildschirmaktualisierung stoppe und dabei das VisualBasic offen lasse, ist dann die Geschwindigkeit trotzdem verringert? Sonst kann ich ja kaum Debuggen und bei 18'000 Zeilen a 47 Spalten bräuchte der Computer ca. 4Stunden für das herausschreiben in Excel.
Gruss
Sven
Anzeige
@YAL
16.03.2022 15:38:32
Rudi
Hallo,

Wenn Du den Bildschirmaktualisierung stoppt, hast fast dieselbe geschwindigkeit wie eine Array
Quatsch!
Der Zugriff auf Zellen ist erheblich langsamer als auf ein Array. Da ist min. Faktor 30 drin.
Lass mal laufen:

Sub aaa()
Dim x, i, j
Dim t
Dim a
Application.ScreenUpdating = False
t = Timer
For i = 1 To 18000
For j = 1 To 47
x = Cells(i, j)
Next
Next
Debug.Print Timer - t
t = Timer
a = Range(Cells(1, 1), Cells(18000, 47))
For i = 1 To 18000
For j = 1 To 47
x = a(i, j)
Next
Next
Debug.Print Timer - t
End Su
Gruß
Rudi
Anzeige
und wenn du in die Zellen schreibst, ...
16.03.2022 15:45:57
Rudi
... wird's ganz böse.
keine Ahnung. Ab einer bestimmter Grösse...
16.03.2022 15:58:45
Yal
... arbeite ich eh nicht mehr mit Excel.
CSV & Power Query, wenn das Ergebnis in einer Pivottabelle gebracht werden kann (ja, ok, es ist immer noch Excel)
Access, wenn ich die Zwischenschritte der Verarbeitung visualisieren möchte,
Python, wenn es mit Statistik verbunden ist,
andere ETL-Tool, wenn Fernzugriff,
Tm1, wenn es beruflich und Multiuser ist.
VG
Yal
AW: keine Ahnung. Ab einer bestimmter Grösse...
16.03.2022 16:59:57
Sven
Hoi Yal
zum Verständnis: die Tabelle ist eine Fehlerliste, die bereits über mehrere Jahre gefüllt wird und wir bekommen diese von SharePoint jedes Mal aufs neue als unbearbeitete .xlsx Datei. Diese ist Mittlerweile auf 18'209 Zeilen mit je 47 Spalten angewachsen und muss jedes Mal wieder komplett von vorne durchgerechnet werden, wenn wir die aktuellen Zahlen wissen wollen (Fehlerneuzugänge, Offene Reperaturen (je nach Abteilung, usw.).
Das dauert, mit dem jetzigen Makro, ca. 25min und diese Zeit würde ich gerne verringern. Um meinen Chef zu unterstützen habe ich vor vielen Monaten dieses Makro mal angefangen und es wurde Stückchen für Stückchen immer weiter aufgeblasen. Es passt halt hinten und vorn nicht gut zusammen und nur der gute Wille hält es am laufen...
Daher mache ich Versuche mit Arrays die bearbeitet und dann wieder zurückgespielt werden, in der Hoffnung, dass das schneller geht.
Gruss
Sven
Anzeige
Ja, hört sich nach Power Query oder Access. owT
16.03.2022 17:30:12
Yal
AW: 2D-Array in Range kopieren
16.03.2022 11:46:58
Daniel
Hi
Du verheddert dich da wahrscheinlich in deinem Versuch, den Zellbereich als Range("Adresse") darzustellen was erfordert, die Spaltennummer, welche man oft als Basis hat, in einen Spaltenbuchstaben um zurechnen.
Schau dir mal die alternativen beschreibungsmöglichkeiten für zellnereiche an, nämlich

Range(Cells(Zeile, Spalte), Cells(Zeile, Spalte))
Cells(Zeile, Spalte).Resize(Anzahl Zeilen, Anzahl Spalten)
Gruß Daniel
AW: 2D-Array in Range kopieren
16.03.2022 13:32:08
Sven
Hoi Daniel
Danke, werde es ausprobieren. Gibt ja immer mehrere Wege, die nach Rom führen... irgendwie komm ich da schon hin und wenns nicht mit der Kutsche geht, dann halt mit dem Handkarren.
Gruss
Sven
Anzeige
AW: 2D-Array in Range kopieren
16.03.2022 13:46:28
Rudi
Hallo,
sollte mit

Range("A2").Resize(UBound(arr_owssvr), Ubound(arr_owssvr, 2)) =  arr_owssvr
funktionieren.
Gruß
Rudi
AW: 2D-Array in Range kopieren
16.03.2022 15:15:31
Sven
Hallo Rudi
leider komme ich auch mit dieser Variante aufs gleiche Ergebnis: Fehler 1004- ohne weitere Aussage. Kann ich da noch irgendwo nachschauen, ob der Fehler vielleicht präziser formuliert ist?
Gruss
Sven
1004 = Blattschutz
16.03.2022 15:21:34
Rudi
wenn der aktiv ist, kannst du das Array nicht zurückschreiben.
AW: 1004 = Blattschutz
16.03.2022 15:32:44
Sven
Hoi Rudi
der Blattschutz ist nicht aktiv. Mit aktivem Blattschutz ändert sich auch die Fehlermeldung und gibt an, dass der Blattschutzaktiv sei.
Gruss
Sven
Anzeige
nicht weiter ohne die Mappe. owT
16.03.2022 15:40:16
Rudi
AW: nicht weiter ohne die Mappe. owT
16.03.2022 17:06:18
Sven
Hoi Rudi
Die Liste darf ich nicht rausgeben und die Mappe, ich nehme an Du meinst den gesamten Code(?), gibt es noch nicht, stehe erst am Anfang und mir geht es vorerst wirklich um das Verständnis, ob eine solch grosse Liste überhaupt so bearbeitet werden kann, wie ich mir das vorstelle und woher dieser 1004 Fehler kommt.
Gruss
Sven
AW: nicht weiter ohne die Mappe. owT
16.03.2022 21:31:52
Rudi

mir geht es vorerst wirklich um das Verständnis, ob eine solch grosse Liste überhaupt so bearbeitet werden kann,
kann man.

und woher dieser 1004 Fehler kommt.
das kann man nicht sagen, ohne das Blatt zu kennen. Evtl. gibt es Fehlerwerte im Array?
Gruß
Rudi
Anzeige
AW: nicht weiter ohne die Mappe. owT
21.03.2022 14:31:10
Sven
Hoi Rudi
Ich bin Werte im Array, bzw. in der Tabelle durchgegangen und habe tatsächlich zwei Werte gefunden, die Fehler verursacht haben. In einer Spalte war geschriebener Text abgespeichert und 2x begann dieser Text mit: "=N Grundlast_1..." Beim in das Array kopieren, gab es keinen Fehler, erst beim wieder hineinschreiben in die Exceltabelle. (Eben jene "Fehler 1004" und "Fehler 1007" ohne jedweden Hinweis auf des Fehlers Herkunft.)
Uffz. Jetzt funktioniert das ganze. Array mit 18'404 Zeilen und 47Spalten in 3.5s in eine Tabelle geschrieben. So stelle ich mir das vor!
Vielen Dank für Eure Hilfe!
Liebe Grüsse
Sven
AW: 2D-Array in Range kopieren
16.03.2022 21:16:39
onur
Welche genaue Fehlermeldung (Text) kommt denn ?

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige