wie Array in Range(nichtInEinzelneZellen)speichern
03.08.2007 16:50:00
felix
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.