Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler bei Excel.workbooks.Open (...) (https://www.delphipraxis.net/118354-fehler-bei-excel-workbooks-open.html)

Andreas Leix 6. Aug 2008 09:51


Fehler bei Excel.workbooks.Open (...)
 
Hallo zusammen !

Arbeite unter delphi2007. Habe mir Routinen geschrieben um in eine bestehende Excel-Datei
Daten reinzuschreiben. Das klappt wunderbar mit Excel 2007. Auf anderen Rechnern ist aber Excel 2000 drauf
und da läuft mein Programm nicht .

Dazu verwende ich folgenden Code

Delphi-Quellcode:
uses ExcelXP;
...
var Excel : TExcelApplication;
    WB    : _WorkBook;
...
  WB:= Excel.Workbooks.Open (strDokument, emptyParam, emptyParam, emptyParam, emptyParam,
                              emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam,
                              emptyParam, emptyParam,emptyParam, emptyParam,lcid );
Wie gesagt mit Excel 2007 läuft das Prima,
mit Excel2000 gibts bei "Workbooks.Open" einen Laufzeitfehler ( "Zugriffsverletzung ....")

Nun habe ich bezgl workbooks.Open schon gelesen, dass sich da die ANZAHL der Aufrufparameter geändert hat.

Wie kann man denn mit sowas umgehen. Mein Programm soll ja auf verschiedensten Ziel-systemen mit evtl. unterschiedlichen Excel-Versionen laufen.

Die Excel-Version könnte ich zu Laufzeit wahrscheinlich noch irgendwie bestimmen,
aber was mach ich mit dem Aufruf von Workbooks.Open ?
Der läßt sich ja nur mit genau der Anzahl von Parametern compilieren!

Da ist doch ein allgemeines Problem beim Einbinden der Unit ExcelXP, oder ?


Hat jemand eine Ahnung ?

Gruß Andreas

Errraddicator 6. Aug 2008 09:52

Re: Fehler bei Excel.workbooks.Open (...)
 
Warum gibste überhaupt die ganzen Leerparameter mit an?
Kannste nich einfach nur Workbooks.Open('Name') schreiben?

...

Edit:
Achso Du nutzt diese TExcelApplication Klasse.
Sah mir zuerst nach OLE aus.

mkinzler 6. Aug 2008 10:01

Re: Fehler bei Excel.workbooks.Open (...)
 
Zitat:

Achso Du nutzt diese TExcelApplication Klasse.
Sah mir zuerst nach OLE aus.
Die Klasse verwendet ebenfalls OLE. Es handelt sich halt nur um frühe Bindung

Andreas Leix 6. Aug 2008 10:05

Re: Fehler bei Excel.workbooks.Open (...)
 
Würde ich mit "später Bindung" um das Problem herum kommen ?

Wenn ja , wie stell ich das an?


Gruß Andreas

Errraddicator 6. Aug 2008 10:25

Re: Fehler bei Excel.workbooks.Open (...)
 
Also ich mache es im Moment so...

Delphi-Quellcode:
procedure prod();
var
  vExcel: Variant;
  vWorkbook: Variant;
  vWorksheet: Variant;
  rowIdx: Integer;
begin
  CoInitialize(nil);
  try
    vExcel    := CreateOleObject('Excel.Application');
    vWorkbook := vExcel.Workbooks.Open('Datenquelle.xls');
    vWorksheet := vWorkbook.ActiveSheet;

    rowIdx := 2;
    while <SonstWas> do
    begin
      ShowMessage(vWorksheet.Cells[rowIdx, 3]);
    // usw halt
Sprich Du machst für jedes Objekt was Du direkt brauchst eine Variable vom Typ Variant und kannst dann mehr oder weniger direkt VBA programmieren.
Der Compiler kennt die Funktionen dann allerdings natürlich nich, d.h. der meckert falsch geschrieben Funktionen etc. erst zur Laufzeit an.

Aber so mache ich das im Moment und das klappt wunderbar.

mkinzler 6. Aug 2008 10:53

Re: Fehler bei Excel.workbooks.Open (...)
 
Besser OleVariant.
Du könntest auch die passenden Wrapper für Office2000 installieren. du scheinst die für OfficeXP gewählt zu haben

Errraddicator 6. Aug 2008 10:54

Re: Fehler bei Excel.workbooks.Open (...)
 
Echt?
Ok, werde ich demnächst dann wohl berücksichtigen.

Was hat das denn fürn Sinn wenn ich fragen darf? :)
Bzw. wo is der Unterschied zwischen Variant und OleVariant?

Andreas Leix 6. Aug 2008 11:06

Re: Fehler bei Excel.workbooks.Open (...)
 
Ich probier´s jetzt gerade ohne die fix gebundenen Typen TExcel, Tworkbook...,
sondern mit mit OLEVariant.
Ich komm dabei ein bisschen weiter, allerdings muß ich erst verschiedene Stellen,
wo ich die TExcelApplication und TWorksheetetc verwendet habe umändern.

Ein anderes Package einzubinden bringt nichts !!
Ich will die Software weitergeben und
weiss zur Compile-Zeit ja nicht,
welches Office auf dem Ziel-Rechner installiert ist.

Gruß
Andreas

mkinzler 6. Aug 2008 11:12

Re: Fehler bei Excel.workbooks.Open (...)
 
OleVariant ist ein COM-Typ ist zwar momentan dasselbe könnte sicgh aber ändern.
Zitat:

Ein anderes Package einzubinden bringt nichts !!
Ich will die Software weitergeben und
weiss zur Compile-Zeit ja nicht,
welches Office auf dem Ziel-Rechner installiert ist.
Dann nimm trotzdem das von Office2000. das funktioniert dann mit den neuren auch. Umgekehrt, wie du siehst, nicht.

sx2008 6. Aug 2008 11:38

Re: Fehler bei Excel.workbooks.Open (...)
 
Ich würde die frühe Bindung empfehlen und bei Problemen kurzzeitig auf die späte Bindung umschalten:
Delphi-Quellcode:
uses ExcelXP;
...
var Excel : TExcelApplication;
    WB    : _WorkBook;
    x : OleVariant;
...
  x := Excel.Workbooks.Open(strDokument);
  // man kann hier sogar benannte Parameter verwenden.
  // das erhöht die Lesbarkeit des Code und man erspart sich die "EmptyParam"-Orgie
  x := Excel.Workbooks.Open(FileName:=strDokument); // "FileName" ist der Parametername

  // zur Sicherheit prüfen, dass auch wirklich ein Dispatch-Interface vorliegt:
  if VarType(x) <> varDispatch then
     raise Exception.Create('Problem bei Ansteuerung von Excel');

  // und jetzt wieder zurück zur frühen Bindung
  WB := IDispatch(x) as _WorkBook;

  // jetzt gibt es 2 Referenzen auf das Workbook-Objekt
  // wer mag, kann jetzt die Referenz auf IDispatch-Interface freigeben
  x := Unassigned;
Mit diesem Trick kann man das Beste aus beiden Welten (frühe und späte Bindung) vereinen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.
Seite 1 von 2  1 2      

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