Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Excel per OLE speichern, wenn im Editiermodus (https://www.delphipraxis.net/211160-excel-per-ole-speichern-wenn-im-editiermodus.html)

devidespe 4. Aug 2022 15:03

Excel per OLE speichern, wenn im Editiermodus
 
Hallo zusammen,

ich versuche Excel per OLE zu öffnen und eine bestehende Tabelle zu laden, sowie beim Programmende wieder zu speichern und schließen. Das klappt mit nachfolgendem Code auch sehr gut. Allerdings gibt es Probleme, wenn sich Excel im Editiermodus befindet, ich also gerade Daten in ein Feld eingebe (erreichbar z.B. mit F2). Dann liefern die Aufrufe zum Speichern eine EOleSysError-Exception mit dem Text "Aufruf wurde durch Aufgerufenen abgelehnt".

Daher muss ich irgendwie vor dem Speichern prüfen, ob der Editiermodus aktiv ist bzw. diesen deaktivieren, bevor ich mit dem Speichern fortfahren kann. Hat jemand eine Idee, wie ich das bewerkstelligen kann? Danke für Eure Antworten...

Delphi-Quellcode:
var
  fFileName : String;
  Excel, ExcelWorkbook : OleVariant;
begin
  Excel := CreateOleObject('Excel.Application');
  Excel.Visible := True;
  ExcelWorkBook := Excel.WorkBooks.Open(fFileName);

  ...

  if not VarIsEmpty(Excel) then
  begin
    try
      ExcelWorkbook.Saved := False; //hier beginnt die Exception, wenn sich Excel im Editiermodus befindet
      ExcelWorkbook.Close (SaveChanges := True);
      Excel.Quit;
      Excel := unassigned;
    except
      on E:Exception do
        ShowMessage('Es ist eine Exception aufgetreten: ' + E.ClassName + #13#13 + E.Message);
      end;
    end;

jus 4. Aug 2022 15:22

AW: Excel per OLE speichern, wenn im Editiermodus
 
nur als Brainstorming Idee. Ich vermute, dass du nichts gegen den Editiermodus machen kannst. Du kannst vielleicht vor dem Beenden probieren, im Programm abzufragen, ob Excel sich in Editiermodus befindet und den Anwender nett bittest, aus dem Editiermodus rauszugehen, damit dein Programm wieder die Kontrolle übernehmen kann. Vielleicht als weiteres Sicherheitsnetz, das Autospeichern in Excel aktivieren :wink:

KodeZwerg 4. Aug 2022 15:28

AW: Excel per OLE speichern, wenn im Editiermodus
 
Excel.Application.Interactive kann man nutzen um eine vorige Überprüfung durchzuführen.

mmw 4. Aug 2022 15:33

AW: Excel per OLE speichern, wenn im Editiermodus
 
Hallo,

application.sendkeys

https://docs.microsoft.com/de-de/off...ation.sendkeys

https://stackoverflow.com/questions/...cell-edit-mode

vielleicht hilft's.

Gruß

devidespe 4. Aug 2022 21:04

AW: Excel per OLE speichern, wenn im Editiermodus
 
Danke für die Antworten.

Ich bin vorhin über eine zusätzliche Eigenschaft gestolpert, die ich auf False setzen könnte:

Application.EditDirectlyInCell

https://docs.microsoft.com/de-de/off...directlyincell

Wenn ich gerade im Editiermodus bin und Text in eine Zelle eingebe, könnte das die Lösung sein, ich werd’s morgen probieren

devidespe 5. Aug 2022 09:01

AW: Excel per OLE speichern, wenn im Editiermodus
 
Okay Excel.Application.Interactive und Excel.Application.EditDirectlyInCell erzeugen beide jeweils eine Exception, wenn ich mich zum Zeitpunkt der Abfrage im Editiermodus befinde.

Selbst wenn ich die entstehende Exception als Zeichen für den Editiermodus deute, und entsprechend handhaben möchte, kann ich Excel nicht beenden, weil Excel.Quit ebenfalls eine Exception erzeugt.

Seltsam alles, offenbar scheint es keine verlässliche Möglichkeit zu geben, den Editiermodus zu erkennen, diesen zu beenden, oder Excel zu beenden - wenn sich Excel zum Zeitpunkt der Abfrage bereits im Editiermodus befindet.

KodeZwerg 5. Aug 2022 09:10

AW: Excel per OLE speichern, wenn im Editiermodus
 
Aber ein
Delphi-Quellcode:
CoInitialize(nil);
und
Delphi-Quellcode:
CoUninitialize;
hast Du schon irgendwo vorher/nachher aufgerufen?

devidespe 5. Aug 2022 09:41

AW: Excel per OLE speichern, wenn im Editiermodus
 
Die basieren ja auf dem COM Modell - so wie ich das verstanden habe, ist OLE etwas anderes.

Ich habe auch per:

Delphi-Quellcode:
Application.SendKeys('{Enter}');
versucht den Editiermodus per Tastendruck zu beenden, aber es ändert nichts. Laut mehreren Quellen erlaubt Excel explizit nach außen hin nicht die Erkennung/Steuerung dieses Editiermodus. Ich habe mich mit der Exception beholfen, die bei Application.Ready auftritt, und deute das als Editiermodus, bei dem der Nutzer manuell den Modus verlassen muss. Nicht optimal, aber relativ zuverlässig.

shebang 5. Aug 2022 09:50

AW: Excel per OLE speichern, wenn im Editiermodus
 
Zitat:

Zitat von devidespe (Beitrag 1509793)
Die basieren ja auf dem COM Modell - so wie ich das verstanden habe, ist OLE etwas anderes.

Dann ist vielleicht OleInitialize das richtige, wobei das intern auch CoInitialize aufruft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 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