![]() |
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; |
Re: Fehler bei Excel.workbooks.Open (...)
Hallo,
ich wußte nicht, dass man mit Varianten solche "Schhweinereien" machen kann; also Methoden aufrufen, die man eigentlich nicht kennt, ohne fixe Anzahl von Parametern etc... Also erstmal vielen Dank an Euch !! Jetzt hab ich aber dennoch ein paar Anmerkungen/ Fragen : Folgender Code läßt sich nicht compilieren: Zitat:
Delphi-Quellcode:
schreibe.
var Excel : OleVariant ;
Excel := CreateOleObject('Excel.Application'); x := Excel.Workbooks.Open(strDokument); ... Aber, hab ich den Kern des Tipps richtig verstanden ? Man kann Ole-Varianten typisierten Variablen zuweisen und dann auf die Methoden zugreifen ? Geht das auch umgekehrt ? also z.b. sowas :
Delphi-Quellcode:
Und wie stehts dann mit dem Freigeben der Referenzen aus ?
var Excel: TExcelApplication ;
WB,X: OleVariant; begin Excel := TExcelApplication.Create ( nil ); X:= Excel as OleVariant; WB:= X.WorkBooks.Open ('Blubber'); ... end; Noch eine andere Frage. Wenn ich nur mit Varianten arbeite, dann brauch ich auch das Unit ExceXP oder ähnliches nicht aufnehmen, oder ? Dann geschieht das Hochfahren/ Ansprechen von excel rein durch ?
Delphi-Quellcode:
Gruß vom lernenden
MyExcel := CreateOleObject('Excel.Application');
Andreas |
Re: Fehler bei Excel.workbooks.Open (...)
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Fehler bei Excel.workbooks.Open (...)
Hoppla, da hab ich nicht richtig aufgepasst (das kommt davon, wenn man Sourcecode ohne IDE eintippt).
Delphi-Quellcode:
Wenn du die Unit ExcelXP oder Excel97 nicht aufnimmst, dann bist du ja komplett bei der späten Bindung,
uses ExcelXP;
... var Excel : TExcelApplication; WB : _WorkBook; x, wbs : OleVariant; ... wbs := Excel.Workbooks as IDispatch; x := wbs.Open(strDokument); die zwar sehr flexibel aber auch langsam und nicht typsicher ist. Für kleinere Aufgaben mit Excel geht das durchaus in Ordnung. Bei grösseren Aufgaben ist es besser, wenn man nicht alles über OleVariant (und IDispatch-Schnittstellen) abwickelt. |
Re: Fehler bei Excel.workbooks.Open (...)
Ok,jetzt habe ich einiges verstanden.
Jetzt komm ich weiter. Also euch allen nochmal vielen Dank! Gruß Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 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