![]() |
Code beschleunigen
Hallo,
ich suche und ersetze Text in einer Excel-Spalte mit folgendem Code:
Delphi-Quellcode:
Beide Schleifen werden ca. 5300 mal durchlaufen. Wie kann ich da an der
Application.ProcessMessages;
for i := 0 to sl.Count-1 do begin Label6.Caption := IntToStr(i); Label6.Refresh; if sl[i] <> '' then begin arr := explode(';',sl[i]); for j := 1 to 5324 do begin help := Sheet.Cells[j,13].Value; help := StringReplace(help,arr[0],arr[1],[rfReplaceAll]); Sheet.Cells[j,13].Value := help; end; arr := nil; end; end; Gechwindigkeit noch was drehen? (sl ist eine StringList) Viele Grüße ... |
Re: Code beschleunigen
StringReplace vom FastCode Projekt oder die JEdi Sachen sind auch schon schneller als Delphi ..
Eine Kopie sparen:
Delphi-Quellcode:
das langsamste wird aber wohl der Excel Zugriff sein.
Sheet.Cells[j,13].Value := StringReplace(help,arr[0],arr[1],[rfReplaceAll]);
|
Re: Code beschleunigen
Hi,
nein, ich ersetze einen String. arr ist ein dynamisches Array. Viele Grüße ... |
Re: Code beschleunigen
Ist Excel während des Vorgangs sichtbar?
|
Re: Code beschleunigen
Im Moment schon. muss aber nicht!
|
Re: Code beschleunigen
Es sollte dann schneller sein.
|
Re: Code beschleunigen
Hmm ich glaube ein par Sekunden bringt das schon. Ein Durchlauf der ersten Schleife dauert aber
immer noch ~ 24 Sek. Kann das sein? |
Re: Code beschleunigen
Zitat:
|
Re: Code beschleunigen
Hi,
das bringt mir nochmal ne Sekunde (Label Refresh ganz raus)! Mann, da muss doch noch was gehen :? |
Re: Code beschleunigen
rausnehmen kannst ja dann auch noch arr := nil;
vllt bringt dir das auch noch mal nen wenig ein.. |
Re: Code beschleunigen
Stimmt! Testen wir mal ...
|
Re: Code beschleunigen
nimm dochmal schrittweise jeden Befehl raus, und schau wo der Flaschenhals ist ..
propier doch mal:
Delphi-Quellcode:
if i Mod 10 = 0 then begin
Label6.Caption := IntToStr(i); Label6.Refresh; end; |
Re: Code beschleunigen
Ich würde darauf Tippen das 99% der Rechenzeit in den beiden Zeilen
Delphi-Quellcode:
da du einen COM-Out-Of-Process-Server verwendest. Falls du auch noch über Frühe Bindung gehst (Sheet: OleVariant) kannst du jedliche andere Optimierung vergessen. Hier solltest du über GetRange/SetRange arbeiten um den ganzen Block als Variant Array in deinen Adressraum holen. Leider kann ich dir keinen Sourcecode liefern da ich dies auch nur von einer Kaufkomponente habe. Alternativ könntest du native Excel-Format wie Flexel kaufen welche Exceldateien native laden können.
help := Sheet.Cells[j,13].Value;
... Sheet.Cells[j,13].Value := help; |
Re: Code beschleunigen
welche Werte haben bei dir arr[0] und arr[1]? Sind die beiden Werte gleich lang? Wenn ja - wie lang?
|
Re: Code beschleunigen
Wie hast Du denn das Excel eingebunden, bzw. was genau ist Sheet? Wenn Sheet ein Variant ist, dann liegt da die Lösung. COM-Objekte als Variants verbraten enorm viel Zeit mit nichts tun.
Sherlock |
Re: Code beschleunigen
Liste der Anhänge anzeigen (Anzahl: 1)
Es gibt zwei Möglichkeiten :
1.) Die Unit in der angehängten Datei habe ich mal gefunden und es soll laut Beschreibung, ziemlich schnell gehen. 2.) Im Excel-Makrocode kannst Du so einen String-Replace durchführen
Code:
Set Intstring = "25=>35"
Intstring = WorksheetFunction.Substitute(Intstring, "=>", "") |
Re: Code beschleunigen
Was auch noch ein wenig Geschwindigkeit bring ist
Code:
ExcelApp.ScreenUpdating[0] := False;
try ... finally ExcelApp.ScreenUpdating[0] := True; end; |
Re: Code beschleunigen
Hallo nochmal und Danke an alle,
nachdem meine Funktion in der letzten Nacht 8 h für 1000 (das war nur ein/Fünftel!) Datensätze gebraucht hat, habe ich die betroffene Excel-Spalte als Textdatei gespeichert und nach Bearbeitung einfach wieder in Excel eingefügt (zum Glück lagen keine Formatierungen bzw. Formeln darauf). Der Code macht die gesammte Liste jetzt in einer Minute:
Delphi-Quellcode:
Unglaublich, was Excel da an Performance schluckt :shock:
for i := 0 to sl.Count-1 do
begin Label6.Caption := IntToStr(i); Label6.Refresh; if sl[i] <> '' then begin arr := explode(';',sl[i]); for j := 0 to nuList.Count-1 do begin help := StringReplace(nuList[j],arr[0],arr[1],[rfReplaceAll]); nuList[j] := help; end; end; end; Viele Grüße ... |
Re: Code beschleunigen
Das ist nicht unbedingt Excel, was da Performance schluckt. Wäre ja auch fatal.
Du solltest versuchen, so viel wie möglich mit den Excelroutinen zu erledigen, ansonsten bewegst Du zu viel zwischen Deiner App und Excel hin und her, und je nach Einbindung von Excel kostet das Performance. Sherlock |
Re: Code beschleunigen
Zitat:
da hast du Recht und so wars auch gemeint. Am liebsten wäre es mir gewesen, wenn ich das über ein Macro hätte regeln können, aber da hätte ich mich erst einarbeiten müssen. Viele Grüße ... |
Re: Code beschleunigen
Zitat:
Ich kann hier komplette Excel-Sheets mit mehreren 10.000 Zeilen in ein paar Sekunden einlesen. Jedoch hol ich mit das alle En-Block in einem VarArray. |
Re: Code beschleunigen
Hi,
ja war die frühe Bindung! Viele Grüße ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz