Entwickler-Ecke
Dateizugriff - Delphi 7 und Excel (Office 2010)
Oliver Maas - Do 21.03.13 16:39
Titel: Delphi 7 und Excel (Office 2010)
Hallo allerseits,
kann ich mit meinem Delphi 7 auch ein Excel von Office 2010 automatisieren? (OLE)
Ich hatte das zwar schon mal gemacht, aber mit deutlich älteren Office-Versionen.
Muss ich da eine spezielle Typbibliothek verwenden? (wenn ja: woher nehmen?)
In dem *.xls ist auch ein VB Makro drin, welches über Buttons ausgelöst wird.
Ist das auch über OLE zugänglich (also in diesem Fall das, was der Excel-Button auslöst)?
freundliche Grüße
Olli
Gerd Kayser - Fr 22.03.13 19:15
Oliver Maas hat folgendes geschrieben : |
In dem *.xls ist auch ein VB Makro drin, welches über Buttons ausgelöst wird.
Ist das auch über OLE zugänglich (also in diesem Fall das, was der Excel-Button auslöst)? |
Zum Nachlesen:
http://www.djpate.freeserve.co.uk/Automation.htm
Insbesondere "Late Binding" bei den Beispielen dürfte für Dich interessant sein.
Zum Testen (Delphi XE und Excel2007) habe ich mal folgendes Makro erstellt (färbt nur einige Spalten ein):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| Sub Einfaerben() ' ' Einfaerben Makro '
' Range("E3:E12").Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent3 .TintAndShade = -0.249977111117893 .PatternTintAndShade = 0 End With Range("G3:G12").Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent6 .TintAndShade = 0.599993896298105 .PatternTintAndShade = 0 End With End Sub |
Ein kleines Beispiel in Delphi zum Aufrufen des Makros:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| unit Main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, StdCtrls, Dialogs, ComObj;
type TMainform = class(TForm) Button1: TButton; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private public end;
var Mainform : TMainform;
implementation
{$R *.dfm}
procedure TMainform.Button1Click(Sender: TObject); var Excel : Variant; Blatt : Variant; Ergebnis : Variant; begin try Excel := GetActiveOleObject('Excel.Application'); except Excel := CreateOleObject('Excel.Application'); end; Excel.Visible := True;
Excel.WorkBooks.Open('C:\Test.xlsm'); Blatt := Excel.Worksheets.Item['Tabelle1'];
Blatt.Activate;
Ergebnis := Excel.Run('Einfaerben');
Sleep(5000); Excel.DisplayAlerts := False; Excel.Quit; end;
procedure TMainform.FormCreate(Sender: TObject); begin ReportMemoryLeaksOnShutdown := true; end;
end. |
Bei Delphi 7 sollte das ähnlich sein.
Oliver Maas - Di 26.03.13 17:16
Hallo Gerd,
danke für den Tip.
Ich habe es auch nun schon so weit hinbekommen, dass ich (von D7 aus) ein Makro aufrufen kann, welches unter "Modules" in Excel steht. :)
In Excel kann man aber auch z.B. ein Makro haben, welches unter "Sheet1" steht.
War nun in deinem Beispiel das Makro dem Sheet zugeordnet (oder war es auch unter "Modules")?
freundliche Grüße
Olli
Gerd Kayser - Mi 27.03.13 15:15
Oliver Maas hat folgendes geschrieben : |
In Excel kann man aber auch z.B. ein Makro haben, welches unter "Sheet1" steht.
War nun in deinem Beispiel das Makro dem Sheet zugeordnet (oder war es auch unter "Modules")? |
Makros stehen nach meinen Beobachtungen (Excel 2007) immer unter "Module". Unter den jeweiligen Sheets sind nur die Makros aufgeführt, die auf bestimmte Ereignisse reagieren (Activate, Change usw.). Diese kann man ausführen, in dem man das Ereignis durch eine entsprechende Aktion auslöst (z. B. das entsprechende Sheet aktivieren, Zellinhalte ändern usw.).
Oliver Maas - Di 07.05.13 11:48
Guten Morgen
so, nachdem nun mit Excel 2003 alles prima geklappt hat, nun leider das nächste Problem: der Kunde hat Excel 2010.
Also hab ich auch bei mir Excel 2010 installiert, und das Schreiben der Werte klappt immer noch, leider erscheint
(bei identischem Code) beim Lesen von Zellen die Meldung
"altes Format oder ungültige Typbibliothek"
Aha. Google erzählte folgende Sache: ein Microsoft Bug
http://support.microsoft.com/kb/320369/de
Ok, also bei Abhilfe steht drin "Multilingual User Interface Pack" fürs Office installieren. Also Administrator gefragt, der kannte das nun auch nicht
(wir haben es auch nicht auf der CD gefunden). Im Internet gesucht, was gefunden. Man kommt aber nur auf "buy now" heraus.
Muss man das nun kaufen, oder kann man das downloaden?
Die anderen Abhilfemöglichkeiten (mit "CultureInfo") hab ich nicht ganz kapiert, da steht C++ oder C# Code...
(wenn ich diesen Workaround auch mit D7 machen könnte, wäre es mir natürlich recht...)
viele Grüße
Oliver
Oliver Maas - Mi 08.05.13 13:13
So, ich bin nun wieder etwas weitergekommen. Und zwar machte seit Excel2010 folgende Funktion Probleme:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.ActivateWorksheet(Number: Integer); var WorkBk : _Workbook; WorkSheet : _Worksheet; begin WorkBk := Form1.ExcelApplication1.WorkBooks.Item[1]; WorkSheet := WorkBk.WorkSheets.Get_Item(Number) as _WorkSheet; WorkSheet.Activate(Number); end; |
Ohne das Activate klappt aber alles fast wie gewohnt, und ich musste auch nicht dieses komische Pack installieren.
viele Grüße
Olli
Moderiert von Martok: Code- durch Delphi-Tags ersetzt
Gerd Kayser - Mi 08.05.13 14:47
Oliver Maas hat folgendes geschrieben : |
Und zwar machte seit Excel2010 folgende Funktion Probleme: |
Warum verwendest Du nicht late binding, wie oben in meinem Beispiel?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!