Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Obwohl ExcelApp.Quit wird aber nicht beendet (https://www.delphipraxis.net/169145-obwohl-excelapp-quit-wird-aber-nicht-beendet.html)

t0mmy 2. Jul 2012 13:45

Obwohl ExcelApp.Quit wird aber nicht beendet
 
Hallo!

Also ich fülle ein Excel-File mit Daten:

Mit folgendem Code rufe ich die Excelfunktion zur bearbeitung einer Exceldatei auf:
Delphi-Quellcode:
  ExcelApp1 := CreateOleObject('Excel.Application');
  ExcelApp1.Workbooks.open(aDir + '\Excelliste.xls');
  ExcelListe1 := ExcelApp1.Workbooks[1].WorkSheets[1];
Zum schluss speicher ich die Datei ab und schließe die Excel applikation
Delphi-Quellcode:
ExcelApp1.Workbooks[1].Save;
ExcelApp1.DisplayAlerts := False;
ExcelApp1.Quit;
Jedoch läuft Excel.exe noch immer im Hintergrund (Taskmanager)

Kann mir jemand einen Tipp geben worans liegen könnte?

Edit: Ich hab auch die Suchfunktion genutzt und habe dabei das hier gefunden:

http://www.delphipraxis.net/109658-e...anwendung.html

Aber ist "kill" die einzige Möglichkeit den Excelprozess im Taskmanager zu schließen?

omata 2. Jul 2012 14:06

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
ExcelApp1.Disconnect;

t0mmy 2. Jul 2012 14:17

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
@omata: Deinen Befehl gibt es nicht.

Habe vor lauter drüberlesen vergessen auf die zweite Seite zu klicken.

Dort wird mit folgender Funkion (die auf meinen Code abgeändert wurde) die Excelanwendung auch im Speicher geschlossen:

Delphi-Quellcode:
ExcelApp1.DisplayAlerts := False;
ExcelApp1.Quit;
ExcelApp1 := unassigned;
ExcelListe1 := unassigned;

p80286 2. Jul 2012 14:42

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Leider ist Excel nict gleich Excel.
Unter 2003/vba 6 funktioniert
Delphi-Quellcode:
  Excel.ActiveWorkbook.Close;
  Excel.Quit;
  Excel:=unassigned;
wie gewünscht.

Gruß
K-H

omata 2. Jul 2012 14:52

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Zitat:

Zitat von t0mmy (Beitrag 1173171)
@omata: Deinen Befehl gibt es nicht.

Ups, ich benutze immer TExcelApplication und dort gibt es das Disconnect.

Sorry

FediDelPr 8. Jan 2019 03:12

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Ich habe das selbe Problem. Das geöffnete und wieder geschlossene File bleibt gelockt bis
das Applikationsprogramm beendet ist. Zu diesem Zeitpunkt verschwindet der EXCEL-Eintrag auch
aus der Liste der Hintergrund-Programme im Windows Task-Manager.

Ich führe folgenden Code aus:

Delphi-Quellcode:
Excel.WorkBooks.Close;
Excel.Quit;
Excel := unassigned; (* bringt nichts *)
Ich verwende EXCEL 365 aktuelle Version.

kompi 8. Jan 2019 08:14

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Versuche es mal mit

ExcelApp.application.quit

Dann sollte es funktionieren. Ist jedenfalls bei mir mit Excel 2010 so.

Gruß Kompi

FediDelPr 8. Jan 2019 14:30

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Geht bei mir leider auch nicht.

Ich probiere mal weitere Varianten.

Jumpy 8. Jan 2019 15:12

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
@FediDelPr: Kannst du mal deinen Code zeigen den du jetzt hast (den Part mit Excel)?

kompi 8. Jan 2019 15:35

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Bei dir muss es natürlich heißen:

Excel.application.quit

Es muss jedoch vorher sicher gestellt sein, dass alle Workbooks geschlossen sind. Beim Schließen der Workbooks kann es jedoch passieren, dass Excel fragt, da das Workbook geändert wurde, ob man speichern möchte. Dies sieht man jedoch nicht, wenn Excel auf nicht sichtbar eingestellt ist. Wenn die Datei bereits vorhanden ist, so fragt Excel auch hier, ob die Datei überschrieben werden soll.

Um zu sehen, was passiert, würde ich Excel zunächst auf sichtbar schalten und Displayalerts auf true.

Gruß Kompi

FediDelPr 8. Jan 2019 19:01

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 *)

FediDelPr 8. Jan 2019 19:42

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' ?

Delphi.Narium 8. Jan 2019 20:59

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Probier mal bitte, ob sich damit was ändert:
Delphi-Quellcode:
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;
Ist aus 'nem uralten Quelltext, keine Ahnung, ob es so übernommen werden kann. Aber probieren kann man ja mal ;-)

Chemiker 8. Jan 2019 22:04

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Hallo,

der Code in #11 ist OK.

Delphi-Quellcode:
Excel.Application.Quit;
würde ich löschen.

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

p80286 8. Jan 2019 22:54

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Zitat:

Zitat von FediDelPr (Beitrag 1422898)
In der Applikation lese ich testweise 1000 Zeilen (fast alle leer).
Evtl. hat's damit zu tun. Gibt es eine Art 'end of table' ?

Wenn ich mich richtig erinnere gibt es Rows.Count und Columns.Count. (1..n)

Gruß
K-H

FediDelPr 9. Jan 2019 02:29

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Ich denke da kommen Maximalzahlen von Rows und Columns raus:

Delphi-Quellcode:
 
r := Excel.sheets[1].Rows.Count;
c := Excel.sheets[1].Columns.Count;
Auch die folgenden Ausdrücke liefern noch nicht genau das Gewünschte.
Wenn die ersten Zeilen leer sind, werden diese nicht berücksichtigt.

Delphi-Quellcode:
 
r := Excel.sheets[1].UsedRange.Rows.Count;
c := Excel.sheets[1].UsedRange.Columns.Count;
Wo findet man eigentlich eine schöne Zusammenstellung der OLE Methoden und Eigenschaften
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.
https://stackoverflow.com/questions/...tion-using-vba
Weiss noch nicht exakt wie in Delphi anwenden.

hoika 9. Jan 2019 05:10

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.

Jumpy 9. Jan 2019 08:38

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:
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;
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.

Chemiker 9. Jan 2019 17:08

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

hoika 9. Jan 2019 17:53

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Hallo,
Zitat:

Das eigentliche Problem, das Entfernen von EXCEL, ist damit für mich noch nicht gelöst.
Hast du denn meinen Tipp mal ausprobiert?

FediDelPr 9. Jan 2019 21:20

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
@Hoika

Danke für deinen Tipp. Werde ich noch ausprobieren.

Zurzeit lebe ich mit dem Problem (Löschen im Taskmanager),
ich muss vorerst mal Resultate liefern.

Danke an alle Mitdenkenden.

Jumpy 10. Jan 2019 08:40

AW: Obwohl ExcelApp.Quit wird aber nicht beendet
 
Zitat:

Zitat von Chemiker (Beitrag 1422973)
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

Das kannte ich noch nicht und wollte ich gar nicht glauben, aber ein schneller Test mit Execl bestätigt das. Tatsächlich werden scheinbar nur die Zeilen gezählt von der ersten in der was drin steht bis zur letzten in der was drin steht. Sind also die ersten drei zeilen leer und nur in Zeile 4 steht was drin ist Used.Range.Rows.Count trotzdem nur 1.
Bei uns war das bisher keinem aufgefallen, weil in Zeile 1 immer was steht.
Aber wenn man genauer drüber nachdenkt ist das eine genaue Interprätation des Begriffs "UsedRange".

Womit die Ermittlung der letzten Zeile/Spalte dann funtioniert, wäre z.B.:
Delphi-Quellcode:
ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row
, wobei xlCellTypeLastCell den Wert 11 hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz