Re: Zugriff auf MS Excel
Zitat:
Wenn die Pfade stimmen, sollte auch alles gehen. (Ansonsten mal schnell die TLB's in Dein Projektverzeichnis kopieren) ich hoffe, Du programmierst nicht völlig blind ohne IDE unterstützung mit den komischen OLEVariants :shock: |
Re: Zugriff auf MS Excel
Hallo Allerseits,
der Tipp von Sputnic hat mir den Weg zur Lösung freigeräumt :dancer: :
Delphi-Quellcode:
Die vier Variablen haben folgenden Inhalt:
Uses
ComObj, ActiveX, UrlMon; procedure TForm1.Button1Click(Sender: TObject); var BindCtx : IBindCtx; Mk : IMoniker; chEaten : ULONG; DmyObj : IUnknown; wb : OleVariant; xl : OleVariant; ws : OLEVariant; begin OleCheck(CreateBindCtx(0, BindCtx)); OleCheck(MkParseDisplayNameEx(BindCtx, PWideChar(WideString(_Mappe)), chEaten, Mk)); OleCheck(Mk.BindToObject(BindCtx, nil, IUnknown, DmyObj)); wb := DmyObj as IDispatch; xl := wb.Application; ws := xl.workbooks[_Mappe].WorkSheets[_Tabelle]; ws.range[_Zelle] := _Inhalt; ws := unassigned; wb := unassigned; xl := unassigned; end; _Mappe -> FullName der Arbeitsmappe, z.B. 'D:\Temp\Mappe1.xls' _Tabelle -> Name der Tabelle in der Arbeitsmappe, z.B. 'Tabelle1' _Zelle -> Name oder Koordinaten der Zelle, z.B. 'A1' oder 'MeineZelle' _Inhalt -> der in die Zelle zu schreibende Text Gruß aus Köln Thomas |
Re: Zugriff auf MS Excel
also ich hab da mal gebastelt. Schick, Schick !
Die Lösung gefällt mir besser, als GetActiveOLEObject :-)
Delphi-Quellcode:
unit
ComObj, ActiveX, ExcelXP; // oder nach Belieben // Excel2000; // Excel_TLB; procedure TForm1.Button1Click(Sender : TObject); var eApp : ExcelApplication; begin eapp := SearchExcelAppFromWorkBook('Mappe1'); eApp.Quit; // Mappe beenden eApp := nil; // Excel Instanz beenden eapp := SearchExcelAppFromWorkBook(FFileName); if not assigned(eapp) then eApp := CoExcelApplication.Create; end;
Delphi-Quellcode:
//==============================================================================
// sucht zu einem Workbook (FileName) die passende Excel Application, wenn mehrere // Instanzen von Excel offen sind //============================================================================== function SearchExcelAppFromWorkBook(const aWorkBookName : string) : ExcelApplication; var ROT: IRunningObjectTable; Enum: IEnumMoniker; Fetched: integer; RunningObj: IMoniker; Name: PWideChar; BindCtx: IBindCtx; App : IInterface; wb : _WorkBook; begin result := nil; try OleCheck(CreateBindCtx(0, BindCtx)); OleCheck(GetRunningObjectTable(0, ROT)); if ROT.EnumRunning(Enum) = S_OK then begin Enum.Next(1, RunningObj, @Fetched); while RunningObj <> nil do begin RunningObj.GetDisplayName(BindCtx, nil, Name); // ShowMessage('RunningObj.GetDisplayName: ' + Name); if Name = aWorkBookName then begin ROT.GetObject(RunningObj, app ); App.QueryInterface(_WorkBook, WB); if assigned(WB) then begin // ShowMessage('Gefunden: ' + aWorkBookName); wb.Application.QueryInterface(_Application, result); exit; end; end; Enum.Next(1, RunningObj, @Fetched); end; end; except result := nil; end; end; // SearchExcelAppFromWorkBook |
Re: Zugriff auf MS Excel
könnte man eigentlich in die Codelib stellen :-)
|
Re: Zugriff auf MS Excel und MS Word
Hallo,
nach dem ich es endlich geschaft habe, wollte ich die Routine so abändern, daß ich alle geöffneten Word-Dokumente finde. Problematisch sind dabei neue Dokumente auf Basis einer Vorlage, welche noch nicht gespeichert sind. Hier steht in der ROT nur der FullName der Vorlage, aber nicht der von Word vergebene Name, z.B. "MeineVorlage1". Also dachte ich mir, ich gehe die Word-Instanzen in einer Schleife als OLEVariant in der Variable "App" durch und lese dann die Documents[..] aus :
Delphi-Quellcode:
Aber, warum kann ich die Dokumente nicht, analog VBA, mit App.Documents[j] ansprechen? Ich erhalte immer eine Exception.
function LeseWordDokumente(App: OLEVariant): TStringList;
var i : Integer; Datei : OLEVariant; begin Result := TStringList.Create; if UpperCase(App.Name) = 'MICROSOFT WORD' then begin for j := 1 to App.Documents.Count; do begin Datei := App.Documents[j]; // <-- hier tritt der Fehler auf !!!! SL.Add(Datei.FullName); end; end; Bei Excel funktioniert App.Workbooks[j] einwandfrei. Gruß aus Köln Thomas |
Re: Zugriff auf MS Excel und MS Word
Hallo,
hab's gefunden:
Delphi-Quellcode:
Gruß aus Köln
function LeseWordDokumente(App: OLEVariant): TStringList;
var i : Integer; Datei : OLEVariant; begin Result := TStringList.Create; if UpperCase(App.Name) = 'MICROSOFT WORD' then begin for j := 1 to App.Documents.Count; do begin Datei := App.Documents.Item(j); // Wichtig: Runde Klammern!!! SL.Add(Datei.FullName); end; end; Thomas |
Re: Zugriff auf MS Excel und MS Word
nimm doch endlich mal die Interface Klassen und Deklarationen .. aus ExcelXP .. Excel2000 oder der importierten Excel_TLB
Dasselbe für Word. da lässt es sich gar nicht erst compilieren, und Deine Fehler treten gar nicht auf :-) frühe Bindung bevorzugen anstatt der späten Bindung .. |
Re: Zugriff auf MS Excel
Funktionieren die Interface-Klassen denn auch 100%ig mit allen Versionen von Office 97 bis Office 2007. Von Delphi 6 habe ich noch genau in Erinnerung, daß es Probleme mit den Komponenten gab. Die mit den Komponenten erstellten Programme waren an bestimmte Office-Versionen gebunden. Deshalb bin ich damals auf OLE umgestiegen und war die Versionsprobleme quitt. Und in dem "Gemischtwarenhandel" an Steuerrechner auf der Arbeit habe ich es leider mit allen Versionen seit Office 97 zu tun. Immer die aktuelle Office-Version auf allen Rechner zu haben, ist nicht gerade preiswert ...
|
Re: Zugriff auf MS Excel
also ich meinte nicht die Komponenten mit dem " T " davor. sondern die reinen Interfacedeklarationen.
bei der TLB werden die ja auch automatisch generiert. (geht ja bei jedem OLE Interface) und das ist zu Deinem Vorgehen genau dasselbe, einmal greifst Du auf die Interfaces mit OLEVariant zu, oder eben mit "typisierten" Interfaces .. wie z.b. _Workbook; Wenn Du neue Features von Office2007 aufrufst ( wie z.b. ExportAsFixedFormat) Und nur ein Office 97 installiert ist, passiert es Dir in beiden Varianten, dass das Interface eine Exception wirft. (denke ich mir mal :-) Der Unterschied ist nur, dass bei Deiner Variante aufwändig zur Laufzeit anhand des Quelltextes alle Interfacefunktionen erst in der Registry gesucht werden, bevor sie aufgerufen werden können. Bei der frühen Bindung fällt das weg, und man sagt, es wäre schneller :-) ... wenn ich richtig informiert bin :-) außerdem macht das Programmieren in Deiner Variante keinen Spaß :-) Wenn Du also mit einer Office97_TLB arbeitest, dann funktionieren die auch noch auf Office2007 .... natürlich nicht mit allen Funktionen ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 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