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 öffnen - EOleSysError (https://www.delphipraxis.net/167510-excel-oeffnen-eolesyserror.html)

API 3. Apr 2012 08:41

Excel öffnen - EOleSysError
 
Hallo

Ich öffne Excel mit Late Binding wie folgt:

Delphi-Quellcode:
  try
    XlsApp := GetActiveOleObject('Excel.Application');
  except
    XlsApp := CreateOleObject('Excel.Application');
  end;
Das Problem ist, dass eine Fehlermeldung erscheint, wenn schon eine Arbeitsmappe geöffnet ist und sich der User zugleich in einem Arbeitsblatt im Editiermodus befindet (nach Doppeklick auf Zelle).

Wie kann ich das umgehen?

Zitat:

exception class : EOleSysError
exception message : Aufruf wurde durch Aufgerufenen abgelehnt.

main thread ($c38):
004c1270 +014 MeineExe.exe ComObj OleError
004c1288 +010 MeineExe.exe ComObj OleCheck
004c1d5c +0cc MeineExe.exe ComObj GetIDsOfNames
004c1df9 +071 MeineExe.exe ComObj VarDispInvoke
0045e62a +096 MeineExe.exe Variants _DispInvoke

Bernhard Geyer 3. Apr 2012 08:43

AW: Excel öffnen - EOleSysError
 
Du meinst

Delphi-Quellcode:
    XlsApp := GetActiveOleObject('Excel.Application');
und du landest dann im
Delphi-Quellcode:
    XlsApp := CreateOleObject('Excel.Application');
Zweig, oder?

Was solls? Diese Exception sieht du doch nur Während des Debuggens. Und wieso willst du überhaupt die laufende instanz abgreifen wenn dir auch ein neue Instanz genügt?

API 3. Apr 2012 09:00

AW: Excel öffnen - EOleSysError
 
Habe nun herausgefunden, dass die Stelle, wo der Fehler auftritt, nach dem GetActiveOleObject ist, sobald auf das XLApp zugegriffen wird.

Ursache: Während man sich im Bearbeitungsmodus befindet, ist Excel für den programmatischen Zugriff gesperrt.

Und wieso willst du überhaupt die laufende instanz abgreifen wenn dir auch ein neue Instanz genügt?

Delphi-Quellcode:
 try
    XLApp := GetActiveOleObject('Excel.Application');
  except
    XLApp := CreateOleObject('Excel.Application');
    XLApp.Visible := True;
  end;

  XLApp.Workbooks.Open(sXlsFile); <--- Fehler hier:

Zitat:

Und wieso willst du überhaupt die laufende instanz abgreifen wenn dir auch ein neue Instanz genügt?
Ich möchte damit verhindern, dass immer eine neue Instanz geöffnet wird (neue Excel.exe im TM)

Habe schon einen anderen Lösungsansatz, werde mich später nochmals melden.

Bernhard Geyer 3. Apr 2012 09:05

AW: Excel öffnen - EOleSysError
 
Zitat:

Zitat von API (Beitrag 1159919)
Zitat:

Und wieso willst du überhaupt die laufende instanz abgreifen wenn dir auch ein neue Instanz genügt?
Ich möchte damit verhindern, dass immer eine neue Instanz geöffnet wird (neue Excel.exe im TM)

Und? Diese Instanz wird wieder geschlossen wenn du nicht mehr darauf zugreifst (und Excel auch korrekt in Windows registriert ist).

API 3. Apr 2012 09:41

AW: Excel öffnen - EOleSysError
 
Die Arbeitsmappe möchte ich wirklich in der gleichen Instanz geöffnet haben,
denn es soll möglich sein, zwischen den Arbeitsmappen mit Strg+Tab zu wechseln, Formeln zwischen Arbeitsmappen kopieren zu können, Speicher zu reduzieren, VBA Makros aller geöffneten Arbeitsmappen im VBA Editor einsehen zu können usw...

API 3. Apr 2012 23:52

AW: Excel öffnen - EOleSysError
 
Meine Lösung, damit nicht immer eine neue Instanz geöffnet wird (irgendwie klar)

anstatt so
Delphi-Quellcode:
ShellExecute(0, 'open', 'excel.exe', PChar(sXlsFile), nil, SW_SHOW);
so:
Delphi-Quellcode:
ShellExecute(0, 'open', PChar(sXlsFile), nil, nil, SW_SHOW);

Bernhard Geyer 4. Apr 2012 06:16

AW: Excel öffnen - EOleSysError
 
Zitat:

Zitat von API (Beitrag 1160077)
Meine Lösung, damit nicht immer eine neue Instanz geöffnet wird (irgendwie klar)

anstatt so
Delphi-Quellcode:
ShellExecute(0, 'open', 'excel.exe', PChar(sXlsFile), nil, SW_SHOW);
so:
Delphi-Quellcode:
ShellExecute(0, 'open', PChar(sXlsFile), nil, nil, SW_SHOW);

Und wie willst du jetzt damit automatisiert arbeiten? Das willst du doch sonst würdest du nicht mit OLE versuchen Excel zu starten.


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