Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
892to896
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
892to896
892to896
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

wie Array in Range(nichtInEinzelneZellen)speichern

wie Array in Range(nichtInEinzelneZellen)speichern
03.08.2007 16:50:00
felix
Guten Tag,
bitte helft mir.
Ich möchte die Performance meines Codes verbessern. Der größte Teil der Zeit wird mit Lesen aus Textdateien und Schreiben in Zellen verbraucht. Beim Schreiben muss ich noch abfragen, ob es sich um eine (Text-) Zahl handelt und ggf. formatieren. Bei 1100 Zeilen werden zwischen 2 und 4 Minuten pro Datei (nur das Einlesen und Schreiben der Zellen) benötigt.
Für 17 Dateien mit rund 1100 Zeilen und durchschnittlich über 200 Spalten benötigt mein Kode ca 45 Minuten (es passieren noch weitere Verarbeitungen, die aber zeitlich nicht ins Gewicht fallen). Gelegentlich müssen jedoch Dateien mit über 6000 Zeilen geladen werden. Und dann dauert uns die Verarbeitung schlicht zu lange.
Ich stelle mir vor, dass nicht jedes Arrayelement einzeln in einzelne Zellen, sondern das komplette Array zunächst in eine Zielrange gespeichert wird. Danach möchte ich diese Range (und eben nicht jede Zelle einzeln) auf Inhalte mit 'Komma' prüfen und falls WAHR als Zahl formatieren. Die beiden Stellen habe FETT markiert.
Ich wäre schon für Kodeschnipsel dankbar, in denen das Gesuchte erkennbar ist.
Der zu optimierende Code sieht so aus (baut auf der Vorarbeit anderer auf):
Do Until IsEmpty(wks.Cells(iRow, 1))
sDatei = wks.Cells(iRow, 1).Value
intSource = FreeFile
Worksheets.Add
Open ThisWorkbook.Path & "\" & sDatei For Input As #intSource
Do Until EOF(intSource)
Line Input #intSource, txt
arrAct = Split(txt, "!")
intRow = intRow + 1
For intCol = 0 To UBound(arrAct)
Cells(intRow, intCol + 1).Value = arrAct(intCol)
' falls ein Komma in String enthalten ist, dann
' mache textformatierte Zahl zu Nummernformat
If (InStr(Cells(intRow, intCol + 1).Value, ",")) Then
Cells(intRow, intCol + 1) = Cells(intRow, intCol + 1) * 1
End If
Next intCol
Loop
Close intSource
intRow = 6
iRow = iRow + 1
Loop
Nach Close intSource stehen im Original noch weitere Anweisungen.

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: wie Array in Range(nichtInEinzelneZellen)speic
03.08.2007 17:08:02
Beverly
Hi Felix
versuche es mit diesem Prinzip-Code
Range("C1:C" & UBound(arrAct)) = arrAct
________________________________________

AW: wie Array in Range(nichtInEinzelneZellen)speic
03.08.2007 17:15:00
felix
:Beverly
Danke!
Am Montag gebe ich Erfolgsnachricht.
Schönes Wochenende!

AW: wie Array in Range(nichtInEinzelneZellen)speic
06.08.2007 19:34:34
felix
Hallo Beverly,
nochmals danke für Deine Unterstützung. Es funktioniert. InGi hatte mir zusätzlich unter die Arme gegriffen.
Beste Grüße
Felix

AW: wie Array in Range(nichtInEinzelneZellen)speichern
03.08.2007 17:09:00
Hajo_Zi
Hallo Felix,
ich beziehe mich jetzt mal auf den Betreff. Diurch den Beitrag habe ich mich nicht gearbeitet. Für ein eindimensionales Array
Cells(2, 1) = WorksheetFunction.Transpose(StDateien())
Gruß Hajo

Anzeige
AW: wie Array in Range(nichtInEinzelneZellen)speichern
03.08.2007 17:16:00
felix
:Hajo_Zi
Danke!
Am Montag gebe ich Erfolgsnachricht.
Schönes Wochenende!

AW: wie Array in Range(nichtInEinzelneZellen)speichern
03.08.2007 17:44:21
Hajo_Zi
Hallo Felix,
mein Code hatte noch ein Fehler, hier mal den Code aus meiner Datei.

If UBound(StDateien()) = 1 Then
Range(Cells(2, ByI + 1), Cells(2, ByI + 1)) = _
WorksheetFunction.Transpose(StDateien())
Else
Range(Cells(2, ByI + 1), Cells(UBound(StDateien()), ByI + 1)) = _
WorksheetFunction.Transpose(StDateien())
End If


Gruß Hajo

AW: wie Array in Range(nichtInEinzelneZellen)speichern
06.08.2007 19:39:50
felix
Hallo Hajo,
nochmals danke für Deine Unterstützung. Deinem Ansatz mit .Transpose gehe ich ein anderes Mal nach. Auf dem Auge bin ich derzeit noch zu blind und ich habe jetzt nicht die Zeit die passende Brille zu finden.
InGi hatte mir zusätzlich unter die Arme gegriffen. Die Lösung ist zwar noch nicht komplett (Problem mit Zahltext) aber "wegen der vorhanden Brille" doch rasch umzusetzen.
Beste Grüße
Felix

Anzeige
AW: wie Array in Range(nichtInEinzelneZellen)speichern
03.08.2007 17:23:00
IngGi
Hallo Felix,
ein Array läßt sich auch ohne Schleife in einem Schritt in einen Zellbereich schreiben, was ungefähr Raumschiff Enterprise gegen Opa Helmut auf dem Fahrrad entspricht.
Vom Prinzip her sieht das folgendermaßen aus:
Opa Helmut auf dem Fahrrad:

For i = 1 To UBound(arr)
Cells(1, i) = arr(i)
Next 'i

Raumschiff Enterprise:


Range(Cells(1, 1), Cells(1, UBound(arr))) = arr

Die Sache mit der Kommaprüfung lässt sich meiner Meinung nach so lösen, dass dem fraglichen Zellbereich vorher das Zahlenformat "Standard" zugewiesen wird. Dann sollte Excel alle als Zahl interpretierbaren Einträge automatisch in eine Zahl umwandeln. Im Ganzen müsstest du dann an Stelle von diesem Code:


For intCol = 0 To UBound(arrAct)
Cells(intRow, intCol + 1).Value = arrAct(intCol)
' falls ein Komma in String enthalten ist, dann
' mache textformatierte Zahl zu Nummernformat
If (InStr(Cells(intRow, intCol + 1).Value, ",")) Then
Cells(intRow, intCol + 1) = Cells(intRow, intCol + 1) * 1
End If

diesen Code verwenden können:


With Range(Cells(intRow, intCol + 1), Cells(intRow, intCol + UBound(arrAct)))
.NumberFormat = "General"
.Value = arrAct
End With

Gruß Ingolf

Anzeige
AW: wie Array in Range(nichtInEinzelneZellen)speichern
06.08.2007 19:32:23
felix
Hallo Ingolf,
was soll ich sagen? Genial, genau danach habe ich gesucht. Die Verarbeitungszeit sinkt von rund 50 Minuten auf kaum mehr als 30 Sekunden.
Zum Problem mit den Zahltexten stelle ich eine neue Anfrage ein. Das Ergebnis nach
.NumberFormat = "General"
ist das selbe wie ohne Multiplikation.
Das pauschale Multiplizieren aller Zellen mit 1 hilft dem Problem zwar ab. Es hat aber den nicht tollerierten Effekt, dass alle vorher leeren Zellen danach "0" zeigen.
Nochmals herzlichen Dank!
Gruss
Felix

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige