![]() |
Excel Sheets
Hallo zusammen,
eigentlich einfache Aufgabe, mit Delphi eine Excel Arbeitsmappe erstellen, dort 2 Arbeitblätter einfügen und das zweite Arbeitsblatt umbenennen. Wird in vielen Beiträgen beschrieben, will bei mir aber nicht fehlerfrei funktionieren. Variablen: Excel : Variant und WBOj : Olevariant Excel starten:
Delphi-Quellcode:
try
Excel := GetActiveOleObject('Excel.Application'); Except try Excel := CreateOleObject('Excel.Application'); except Showmessage('Excel konnte nicht gestartet werden!'); OK := false; end; end; Arbeitsmappe anlegen (enthält automatisch ein Tabellenblatt):
Delphi-Quellcode:
WBObj := Excel.Application.Workbooks.Add;
Ein weiteres Tabellenblatt anlegen:
Delphi-Quellcode:
WBObj.Worksheets.add;
Jetzt möchte ich das zweite Tabellenblatt umbenennen. Die folgende Variante funktioniert einwandfrei, kurios ist hierbei jedoch dass Delphi eine Fehlermeldung anzeigt : Undeklarierter Bezeichner 'Activate' in Zeile ... aber trotzdem Compiliert und fehlerfrei ausführt
Delphi-Quellcode:
Bei folgender Variante wird kein Fehler angezeigt, bei der Ausführung erhalte ich jedoch eine Fehlermeldung "Mitglied nicht gefunden"
WBObj.Sheets[2].Activate;
WBObj.ActiveSheet.Name := 'Neu';
Delphi-Quellcode:
Eine oft beschriebene Variante funktioniert überhaupt nicht und wird auch nicht compiliert:
WBObj.ActiveSheet := WBObj.Sheets[Nr];
WBObj.ActiveSheet.Name := 'Neu';
Delphi-Quellcode:
Wer kann mir hier ein wenig auf die Sprünge helfen:gruebel::gruebel:
Excel.WBObj[1].WorkSheets[2].Name := 'Neu';
Gruß Sidi61 |
AW: Excel Sheets
Hallo,
lass mall das "WBOj" weg..
Delphi-Quellcode:
Excel := CreateOLEObject('Excel.Application'); // Excel-Verbindung öffnen
Excel.Application.Workbooks.Add; // Seite erstellen Excel.WorkSheets[1].Name:=Copy(SheetName,1,30); // Arbeitseitenname setzen = max 30 Zeichen ... So gehts... |
AW: Excel Sheets
Oder nutze eine weitere Variable, diesmal für das worksheet:
WSObj:=WBObj.Worksheets.add; WSObj.Name:='Neu'; |
AW: Excel Sheets
Hallo,
es ist zum Mäuse melken, sobald ich die Eckige Klammer verwende zeigt Delphi für nach der Klammer folgende Begriffe einen Fehler mit 'Undeklarierter Bezeichner'
Delphi-Quellcode:
Obiges Beispiel funktioniert einwandfrei obwohl Activate rot unterstrichen ist und der besagte Fehler im Fenster 'Struktur' angezeigt wird.
WBObj.Sheets[2].Activate;
WBObj.ActiveSheet.Name := 'Neu'; Ich habe mal nach Excel Referenzen gesucht und Beispiel für VBA gefunden. Hier werden anstatt eckiger die runden Klammern verwendet. Ändere ich meinen Code wie folgt
Delphi-Quellcode:
wird Activate akzeptiert, die Fehlermeldung verschwindet, der Code kann compiliert werden - bei der Ausführung kommt jedoch die Fehlermeldung 'Mitglied nicht gefunden' - ist natürlich wieder mal eine Meldung mit der man überhaupt nichts anfangen kann!
WBObj.Sheets(2).Activate;
WBObj.ActiveSheet.Name := 'Neu'; Vielleicht hat jemand mal Lust mein Beispiel nachzubauen ggf. mit einer anderen Delphi Version als XE5 ob dort der gleiche Fehler auftaucht. Gruß Sidi61 |
AW: Excel Sheets
Hallo Sidi61,
es gibt einige Wege um ein WorkSheet mit einem neunen Namen zu versehen. Im Beispiel Code steht eine Möglichkeit.
Delphi-Quellcode:
Bis bald Chemiker
procedure TForm1.Button4Click(Sender: TObject);
var oExcel: OLEVariant; oWB1: OLEVariant; oWS1: OLEVariant; oWS2: OLEVariant; begin try oExcel := CreateOleObject('Excel.Application'); except ShowMessage('Microsoft Excel kann nicht starten.'); exit; end; oExcel.Visible:= TRUE; // Workbook anlegen if (NOT VarIsEmpty(oExcel)) then begin oWB1:=oExcel.Workbooks.add; end; if ((NOT VarIsEmpty(oExcel))and(NOT VarIsEmpty(oWB1))) then begin // Wir legen mal ein neues Sheet an, es soll vor den ersten Sheet eingefügt // werden oWS1:= oWB1.Worksheets.add(Before:= oWB1.WorkSheets[1]); oWS1.Name:= 'Erste Blatt'; oWS2:= oWB1.Worksheets[2]; oWS2.Name:= 'Zweites Blatt'; oWS2.activate; ShowMessage('Blatt 2 aktiviert'); oWS1.activate; ShowMessage('Blatt 1 aktiviert'); end; if ((NOT VarIsEmpty(oExcel))and(NOT VarIsEmpty(oWB1)) and(NOT VarIsEmpty(oWS1))and(NOT VarIsEmpty(oWS2))) then begin oWS1.Delete; // Wir löschen das neue Sheet oWS1:= Unassigned; end; // Workbook schliesssen if (NOT VarIsEmpty(oWB1)) then begin oWB1.Saved := TRUE; // ohne Nachfragen oWB1.Close; oWB1:= Unassigned; end; // Excel schliessen if ((NOT VarIsEmpty(oExcel))and VarIsEmpty(olevWB)) then begin oExcel.Quit; oExcel:= Unassigned; end; end; |
AW: Excel Sheets
Hallo Chemiker,
habe es mit deinem Beispiel versucht, es wird kein Fehler angezeigt, Programm lässt sich compilierren allerdings bei der Ausführung oWS2.Name erhalte ich folgenden Fehler: Die methode "Name" wird vom Automatisierunsobjekt nicht unterstützt. Wie soll man das noch verstehen:wall: Gruß Sidi61 |
AW: Excel Sheets
Hallo Sidi61,
ich habe einen Fehler in der Zeile:
Delphi-Quellcode:
if ((NOT VarIsEmpty(oExcel))and VarIsEmpty(olevWB)) then
sie muss geändert werden. Von olevWB nach oWB1.
Delphi-Quellcode:
if ((NOT VarIsEmpty(oExcel))and VarIsEmpty(oWB1)) then
Ich habe das Beispiel unter Delphi Berlin mit Office 2016 und Delphi XE5 mit Office 2007 getestet. Einfach ein Form anlegen einen Button drauf und im onClick-Event den Code kopieren.
Delphi-Quellcode:
Bis bald Chemiker
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.SyncObjs,System.Win.ComObj; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var oExcel: OLEVariant; oWB1: OLEVariant; oWS1: OLEVariant; oWS2: OLEVariant; begin try oExcel := CreateOleObject('Excel.Application'); except ShowMessage('Microsoft Excel kann nicht starten.'); exit; end; oExcel.Visible:= TRUE; // Workbook anlegen if (NOT VarIsEmpty(oExcel)) then begin oWB1:=oExcel.Workbooks.add; end; if ((NOT VarIsEmpty(oExcel))and(NOT VarIsEmpty(oWB1))) then begin // Wir legen mal ein neues Sheet an, es soll vor den ersten Sheet eingefügt // werden oWS1:= oWB1.Worksheets.add(Before:= oWB1.WorkSheets[1]); oWS1.Name:= 'Erste Blatt'; oWS2:= oWB1.Worksheets[2]; oWS2.Name:= 'Zweites Blatt'; oWS2.activate; ShowMessage('Blatt 2 aktiviert'); oWS1.activate; ShowMessage('Blatt 1 aktiviert'); end; if ((NOT VarIsEmpty(oExcel))and(NOT VarIsEmpty(oWB1)) and(NOT VarIsEmpty(oWS1))and(NOT VarIsEmpty(oWS2))) then begin oWS1.Delete; // Wir löschen das neue Sheet oWS1:= Unassigned; end; // Workbook schliesssen if (NOT VarIsEmpty(oWB1)) then begin oWB1.Saved := TRUE; // ohne Nachfragen oWB1.Close; oWB1:= Unassigned; end; // Excel schliessen if ((NOT VarIsEmpty(oExcel))and VarIsEmpty(oWB1)) then begin oExcel.Quit; oExcel:= Unassigned; end; end; end. |
AW: Excel Sheets
Hallo Chemiker,
habe dein Beispiel 1:1 übernommen, es läuft durch und die Tabellenblätter werden entsprechend umbenannt allerdings erhalte ich auch hier in meinem Struktur Fenster die Fehlermeldung: Undeklarierter Bezeichner 'Before' in Zeile... Hab so den Verdacht meine Delphi Version ist hier etwas fehlerhaft. Wollte eigentlich eine Unit schreiben die ich in allen Projekten einsetzen kann, werde mal mit deinem Ansatz weiter experimentieren :| Gruß Sidi61 |
AW: Excel Sheets
Zitat:
Wenn der Compiler sagt es ist OK, dann ignoriere solche Fehlermeldungen einfach. |
AW: Excel Sheets
So, mal deinen Quellcode überarbeitet
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var oExcel: OLEVariant; oWB1: OLEVariant; oWS1: OLEVariant; oWS2: OLEVariant; begin try oExcel := CreateOleObject('Excel.Application'); except ShowMessage('Microsoft Excel kann nicht starten.'); exit; end; if (NOT VarIsEmpty(oExcel)) then // Excel gestartet ? begin try oExcel.Visible:= TRUE; // Excel anzeigen oWB1:=oExcel.Workbooks.add; // Workbook anlegen if (NOT VarIsEmpty(oWB1)) then // Workbook angelegt ? begin // Wir legen mal ein neues Sheet an, es soll vor den ersten Sheet eingefügt // werden oWS1:= oWB1.Worksheets.add(oWB1.WorkSheets[1]); if (NOT VarIsEmpty(oWS1)) then begin oWS1.Name:= 'Erste Blatt'; oWS2:= oWB1.Worksheets[2]; oWS2.Name:= 'Zweites Blatt'; oWS2.activate; ShowMessage('Blatt 2 aktiviert'); oWS1.activate; ShowMessage('Blatt 1 aktiviert'); oWS1.Delete; // Wir löschen das neue Sheet ShowMessage('Blatt 1 gelöscht'); end; oWS1:= Unassigned; oWS2:= Unassigned; // Workbook schliesssen oWB1.Saved := TRUE; // ohne Nachfragen oWB1.Close; oWB1:= Unassigned; end; finally // Excel schliessen oExcel.Quit; oExcel:= Unassigned; end; end; end; das Before:= kann auch weggelassen werden, da 'Before' der erste Parameter von Sheet.Add ist... Somit auch keine Fehlermeldungen... Durch die vielen (NOT VarIsEmpty( wurde es etwas unübersichtlich.. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 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 by Thomas Breitkreuz