![]() |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Ich habe EXCEL nun sichtbar geschaltet.
Die Zellen werden richtig ausgelesen (kein Schreiben). EXCEL wird aus meiner Sicht zwar geschlossen (ohne Frage ob gespeichert werden soll, es wurde auch nichts geändert)verbleibt aber in den Hintergrundprozessen, wie der Taskmanager zeigt. Das zuvor geöffnete File bleibt für erneutes Oeffnen blockiert.
Delphi-Quellcode:
VAR
Excel : Variant; s: STRING; BEGIN ... Excel := CreateOleObject('Excel.Application'); Excel.visible := TRUE; (* vorher FALSE *) Excel.WorkBooks.Open('c:\users\....\TestKreditorenRechnungen.xlsx'); ... (* Es werden nur Daten gelesen *) s := Excel.Sheets['Tabelle1'].Cells[row,column].Value; ... Excel.WorkBooks.Close; Excel.DisplayAlerts := False; (* Discard unsaved files.... *) Excel.Quit; (* alternativ *) Excel.Application.Quit; Excel := unassigned; (* auch probiert *) |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Wenn ich obigen Code ausführe, mit nur einmaligem Lesen, scheint's zu
funktionieren. In der Applikation lese ich testweise 1000 Zeilen (fast alle leer). Evtl. hat's damit zu tun. Gibt es eine Art 'end of table' ? |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Probier mal bitte, ob sich damit was ändert:
Delphi-Quellcode:
Ist aus 'nem uralten Quelltext, keine Ahnung, ob es so übernommen werden kann. Aber probieren kann man ja mal ;-)
var
lcid : Integer; begin excel := TExcelApplication.Create(Self); // Verbindungsart zu Excel festlegen. excel.ConnectKind := ckNewInstance; // Diese ID wird zur Komunikation mit Excel benötigt. lcid := LOCALE_USER_DEFAULT; Try // Excel soll unsichtbar arbeiten. excel.Visible[lcid] := False; excel.Connect; // irgendwas machen Finally // Verbindung zu Excel trennen. excel.Visible[lcid] := True; excel.Disconnect; excel.Free; end; end; |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Hallo,
der Code in #11 ist OK.
Delphi-Quellcode:
würde ich löschen.
Excel.Application.Quit;
Die Ursache muss woanders liegen, es liegt auch nicht an den 1000 Zeilen. Beim Testen kann ein Fehler passieren und die Excel-Instanz wird nicht ordnungsgemäß geschlossen und bleibt beim weiteren Testen offen. Wenn Du neue Workbooks oder Sheets anlegst und Variable dafür verwendest müssen diese auch geschlossen werden, sonst bleibt auch die Excel – Instanz aktiv. Bis bald Chemiker |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Zitat:
Gruß K-H |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Ich denke da kommen Maximalzahlen von Rows und Columns raus:
Delphi-Quellcode:
Auch die folgenden Ausdrücke liefern noch nicht genau das Gewünschte.r := Excel.sheets[1].Rows.Count; c := Excel.sheets[1].Columns.Count; Wenn die ersten Zeilen leer sind, werden diese nicht berücksichtigt.
Delphi-Quellcode:
Wo findet man eigentlich eine schöne Zusammenstellung der OLE Methoden und Eigenschaftenr := Excel.sheets[1].UsedRange.Rows.Count; c := Excel.sheets[1].UsedRange.Columns.Count; für EXCEL? (Nicht unbedingt bei MS, die schaffen das nie verständlich und kompakt) Das eigentliche Problem, das Entfernen von EXCEL, ist damit für mich noch nicht gelöst. Eine weitere Spur ist evtl. ![]() Weiss noch nicht exakt wie in Delphi anwenden. |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Hallo,
vielleicht liegt es ja an der Datei? Erzeuge doch mal die Excel-Klasse und gib sie danach sofort wieder frei und das Laden der Datei. |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Das Zauberwort für Zeilen mit Inhalt heißt in Excel "UsedRange", zudem kann man für workbook und worksheet auch variablen vergeben und leichter arbeiren:
Delphi-Quellcode:
Eine gute Hilfe ist es mMn in Excel den Makro-Rekorder anzuwerfen, das zu machen was man möchte. Dann den VBA-Code verstehen und aufräumen (der Makro-Rekorder übertreit es manchmal) und das dann in Delphi umsetzen.
VAR
Excel : Variant; r,c : integer; // reicht evtl. nicht, je nach Anzahl der Zeilen wb,ws : Variant; //Ist das Ole-Variant, oder sollte man da besser was anderes nehmen, weiß ich gerade nicht? s: STRING; BEGIN ... Excel := CreateOleObject('Excel.Application'); Excel.visible := TRUE; (* vorher FALSE *) wb:=Excel.WorkBooks.Open('c:\users\....\TestKreditorenRechnungen.xlsx'); ws:=wb.Worksheets['Tabelle1']; ... (* Es werden nur Daten gelesen *) for r:=1 to ws.UsedRange.Rows.Count do for c:=1 to ws.UsedRange.Columns.Count do s := ws.Cells[r,c].Value; ... ws:=unassigned; wb.Close(false); wb:=unassigned //nich mehr nötig wegen dem False beim Close //Excel.DisplayAlerts := False; (* Discard unsaved files.... *) Excel.Quit; Excel := unassigned; |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Hallo,
Delphi-Quellcode:
ws.UsedRange.Rows.Count
das muss aber auch nicht immer richtig sein. Sollte die erste Zeile komplett leer sein, wird dies zu einem falschen Ergebnis führen, weil die letzte Zeile nicht mehr ausgelesen wird.
Delphi-Quellcode:
ws.UsedRange.Columns.Count
Das gleiche Problem ist, wenn die erste Spalte komplett leer ist, führt dies auch zu einem falschen Ergebnis. Bis bald Chemiker |
AW: Obwohl ExcelApp.Quit wird aber nicht beendet
Hallo,
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 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