![]() |
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:
Wie gesagt mit Excel 2007 läuft das Prima,
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 ); 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 |
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. |
Re: Fehler bei Excel.workbooks.Open (...)
Zitat:
|
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 |
Re: Fehler bei Excel.workbooks.Open (...)
Also ich mache es im Moment so...
Delphi-Quellcode:
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.
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 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. |
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 |
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? |
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 |
Re: Fehler bei Excel.workbooks.Open (...)
OleVariant ist ein COM-Typ ist zwar momentan dasselbe könnte sicgh aber ändern.
Zitat:
|
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:
Mit diesem Trick kann man das Beste aus beiden Welten (frühe und späte Bindung) vereinen.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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