Autor Beitrag
Oliver Maas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55



BeitragVerfasst: Do 21.03.13 16:39 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 22.03.13 19:15 
user profile iconOliver Maas hat folgendes geschrieben Zum zitierten Posting springen:
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: 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):

ausblenden 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:

ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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;

  // Makro "Einfaerben" ausführen.

  Ergebnis := Excel.Run('Einfaerben');

  Sleep(5000);                   // Damit man beim Testen auch was sieht.
  Excel.DisplayAlerts := False;  // Änderungen an der Datei verwerfen.
  Excel.Quit;                    // Excel beenden.
end;

procedure TMainform.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := true;
end;

end.


Bei Delphi 7 sollte das ähnlich sein.

Für diesen Beitrag haben gedankt: Oliver Maas
Oliver Maas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 27.03.13 15:15 
user profile iconOliver Maas hat folgendes geschrieben Zum zitierten Posting springen:
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.).

Für diesen Beitrag haben gedankt: Oliver Maas
Oliver Maas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55



BeitragVerfasst: 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 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55



BeitragVerfasst: Mi 08.05.13 13:13 
So, ich bin nun wieder etwas weitergekommen. Und zwar machte seit Excel2010 folgende Funktion Probleme:

ausblenden 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); // ergibt mit Number=1 "altes Format oder ungültige Typbibliothek"
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 user profile iconMartok: Code- durch Delphi-Tags ersetzt
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 08.05.13 14:47 
user profile iconOliver Maas hat folgendes geschrieben Zum zitierten Posting springen:
Und zwar machte seit Excel2010 folgende Funktion Probleme:

Warum verwendest Du nicht late binding, wie oben in meinem Beispiel?