AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Excel Sheets

Ein Thema von Sidi61 · begonnen am 29. Sep 2016 · letzter Beitrag vom 6. Okt 2016
Antwort Antwort
Seite 1 von 3  1 23      
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#1

Excel Sheets

  Alt 29. Sep 2016, 21:26
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):
WBObj := Excel.Application.Workbooks.Add;
Ein weiteres Tabellenblatt anlegen:
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:
WBObj.Sheets[2].Activate;
WBObj.ActiveSheet.Name := 'Neu';
Bei folgender Variante wird kein Fehler angezeigt, bei der Ausführung erhalte ich jedoch eine Fehlermeldung "Mitglied nicht gefunden"

Delphi-Quellcode:
WBObj.ActiveSheet := WBObj.Sheets[Nr];
WBObj.ActiveSheet.Name := 'Neu';
Eine oft beschriebene Variante funktioniert überhaupt nicht und wird auch nicht compiliert:

Excel.WBObj[1].WorkSheets[2].Name := 'Neu'; Wer kann mir hier ein wenig auf die Sprünge helfen

Gruß
Sidi61
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#2

AW: Excel Sheets

  Alt 30. Sep 2016, 05:23
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...
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Excel Sheets

  Alt 30. Sep 2016, 10:20
Oder nutze eine weitere Variable, diesmal für das worksheet:

WSObj:=WBObj.Worksheets.add;
WSObj.Name:='Neu';
Ralph
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Excel Sheets

  Alt 30. Sep 2016, 22:24
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:
WBObj.Sheets[2].Activate;
WBObj.ActiveSheet.Name := 'Neu';
Obiges Beispiel funktioniert einwandfrei obwohl Activate rot unterstrichen ist und der besagte Fehler im Fenster 'Struktur' angezeigt wird.

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:
WBObj.Sheets(2).Activate;
WBObj.ActiveSheet.Name := 'Neu';
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!

Vielleicht hat jemand mal Lust mein Beispiel nachzubauen ggf. mit einer anderen Delphi Version als XE5 ob dort der gleiche Fehler auftaucht.

Gruß
Sidi61
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Excel Sheets

  Alt 1. Okt 2016, 01:53
Hallo Sidi61,

es gibt einige Wege um ein WorkSheet mit einem neunen Namen zu versehen. Im Beispiel Code steht eine Möglichkeit.

Delphi-Quellcode:
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;
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Excel Sheets

  Alt 2. Okt 2016, 20:44
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

Gruß
Sidi61
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Excel Sheets

  Alt 2. Okt 2016, 21:20
Hallo Sidi61,

ich habe einen Fehler in der Zeile:

if ((NOT VarIsEmpty(oExcel))and VarIsEmpty(olevWB)) then
sie muss geändert werden. Von olevWB nach oWB1.

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:
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.
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Excel Sheets

  Alt 2. Okt 2016, 21:52
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

AW: Excel Sheets

  Alt 3. Okt 2016, 00:03
Zitat:
Undeklarierter Bezeichner
ErrorInsight hatte noch nie 100% richtig funktioiert und zeigt gern mal falsche Fehler an.
Wenn der Compiler sagt es ist OK, dann ignoriere solche Fehlermeldungen einfach.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#10

AW: Excel Sheets

  Alt 3. Okt 2016, 09:43
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..

Geändert von HolgerX ( 3. Okt 2016 um 09:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 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