Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriff auf eine Excel-Zelle mit Namen (https://www.delphipraxis.net/108006-zugriff-auf-eine-excel-zelle-mit-namen.html)

Linkat 6. Feb 2008 10:39


Zugriff auf eine Excel-Zelle mit Namen
 
Hallo,
ich hole mir Daten aus einer Excel-Tabelle und lade sie in ein StringGrid. Dies funktioniert mit Row- und Colum Number so:

Delphi-Quellcode:
StringGrid1.Cells[1,2]:=ExWS1.Cells.Item[5,6];
Da die Tabelle öfters verändert, sprich verschoben wird, würde ich gern auf die in Excel definierten Namen der Zellen zugreifen.

Wer kann mir einen Tipp geben?

Vielen Dank!

Gruß, Linkat

shmia 6. Feb 2008 12:22

Re: Zugriff auf eine Excel-Zelle mit Namen
 
Zellen haben IMHO keinen Namen, sondern nur Koordinaten.
Diese Koordinaten können absolut oder relativ sein.
Du könntest versuchen mit dem Property Offset zu arbeiten:
Delphi-Quellcode:
// ungetestetes Beispiel
var
  myrange : OleVariant; // Range-Objekt
begin
  myrange := ExWS1.ActiveSheet.Offset[5,7];
  ...
  StringGrid1.Cells[1,2]:=myrange.Cells.Item[1,2];

marabu 6. Feb 2008 12:50

Re: Zugriff auf eine Excel-Zelle mit Namen
 
Hallo ihr beiden,

ein Name referenziert einen Range - auch wenn dann mitunter nur eine einzige Zelle in diesem Range steckt:

Delphi-Quellcode:
sg.Cells[iCol, iRow] := xlSheet.Names.Item('name', null, null).RefersToRange.Cells.Item[0, 0];
So oder ähnlich.

Freundliche Grüße

Linkat 6. Feb 2008 15:15

Re: Zugriff auf eine Excel-Zelle mit Namen
 
Hallo,

@shima
In Excel kann man Bereiche (auch einzelne Zellen) mit einem Namen festlegen (Einfügen -> Name -> Festlegen). Dies hat den Vorteil, dass man Zeilen und Spalten beliebig einfügen oder löschen kann, ohne den Bezug zu dem festgelegten Bereich zu verlieren.

@marabu
Ich habe deine Anweisung an meine Bedürfnisse angepasst:

Delphi-Quellcode:
  SG1.Cells[1,1]:=ExWS1.Names.Item('LTCC_total',null,null).RefersToRange.Cells.Item[0,0];
Das Programm wird ohne Fehlermeldung kompiliert. Aber nach dem Programmstart kommt die Fehlermeldung:
Zitat:

...eine Exception der Klasse EOleException mit der Meldung 'EOle-Fehler 800A03EC' ist aufgetreten.
Hat jemand eine Idee?

Linkat


OS WinXP, Excel 2003, Delphi 2005 Pro

shmia 6. Feb 2008 15:52

Re: Zugriff auf eine Excel-Zelle mit Namen
 
Zitat:

Zitat von Linkat
.... Aber nach dem Programmstart kommt die Fehlermeldung:
Zitat:

...eine Exception der Klasse EOleException mit der Meldung 'EOle-Fehler 800A03EC' ist aufgetreten.

Du kannst dir weitere Informationen zu dieser Fehlermeldung rausziehen:
http://www.delphipraxis.net/internal...ct.php?t=22524
Aussdem sollte man die Arbeit in min. 2 Schritten erledigen:
Delphi-Quellcode:
var
  tmp : OleVariant;

  tmp := ExWS1.Names.Item('LTCC_total',null,null);
  ...
  SG1.Cells[1,1]:=tmp.RefersToRange.Cells.Item[0,0];
So lässt sich das Problem näher einkreisen, da der Debugger ja auf der fehlerhaften Zeile anhält.
Wenn man die Zellen in einer Schleife ausliest, gibt es auch einen Geschwindigkeitsvorteil.

Linkat 6. Feb 2008 16:13

Re: Zugriff auf eine Excel-Zelle mit Namen
 
Hallo shmia,
danke für den Tipp. Hat aber leider nichts geholfen. Die gleiche Fehlermeldung. Der Debugger springt in die Zeile:

Delphi-Quellcode:
tmp:=ExWS1.Names.Item('LTCC_total',null,null);
Hat noch jemand eine Idee?

Gruß, Linkat

shmia 6. Feb 2008 16:31

Re: Zugriff auf eine Excel-Zelle mit Namen
 
Zitat:

Zitat von Linkat
Hat aber leider nichts geholfen.

Natürlich hat das geholfen; das Problem ist eingekreist!
Jetzt nimmt man halt noch 'ne Zwischenvariable:
Delphi-Quellcode:
var tmp, names : OleVariant;
names:=ExWS1.Names;
tmp := names.Item('LTCC_total', null,null);
// oder auch dies versuchen
tmp := names.Item('LTCC_total', EmptyParam, EmptyParam);
Tipp: Excel VBA-Hilfe aufrufen:
in Excel ALT-F11 gefolgt von F1 drücken.

Chemiker 9. Feb 2008 02:25

Re: Zugriff auf eine Excel-Zelle mit Namen
 
Hallo Linkat,

ich weis nicht, ob Du das Problem schon gelöst hast?
Aber vielleicht hilft Dir das weiter:

Delphi-Quellcode:
 Excel.Worksheets['Tabelle1'].Activate;  // Test-Bereich anlegen.
    for I := 0 to 10 do
    begin
      Excel.cells[i+5, 2]:= 'Zeile'+ inttostr(i);
      Excel.cells[i+5, 3]:= 'Zeile1'+ inttostr(i);
    end;
    Excel.Worksheets['Tabelle1'];
    Excel.Range['B5:C15'].Name := 'Test';        // Bereich Test einrichten



    Zeilen:= Excel.range['Test'].rows.count;     // Anzahl Zeilen im Bereich
    Spalten:= Excel.range['Test'].columns.count; // Anzahl Spalten im Bereich
    OleArray:=VarArrayCreate([Spalten,Zeilen],varVariant); // dyn. Array
    OleArray:= Excel.Range['Test'].cells;        // Range-Obj nach OleArray
                                                  // übertragen
    for z := 1 to Zeilen do                      // den Bereich anzeigen.
    begin
      for s := 1 to Spalten do
      begin
        Rueckgabe:= OleArray.item[z,s].value;
        ShowMessage('Laß mal sehen: '+ Rueckgabe);
      end;
    end;

Bis bald Chemiker

Linkat 13. Feb 2008 12:23

Re: Zugriff auf eine Excel-Zelle mit Namen
 
Hallo Chemiker,
vielen Dank für deinen Source-Code. Aber ich bin daran gescheitert. Auch hat mir die Hilfe für VBA auch nicht weitergeholfen. Ich habe viele Dinge ohne Erfolg getestet.

Ich füge hier mal den Code ein, den ich für mich leicht abgewandelt habe:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExcelXP, OleServer;

type
  TForm1 = class(TForm)
    ExAP1: TExcelApplication;
    ExWS1: TExcelWorksheet;
    ExWB1: TExcelWorkbook;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
const dat = 'C:\Book1.xls';
var OLEArray      :Array of oleVariant;
    rueckgabe     :string;
procedure TForm1.Button1Click(Sender: TObject);
var   i,z,s,zeilen,spalten       :byte;
begin
   ExAP1.Workbooks.Open(dat, EmptyParam, EmptyParam, EmptyParam,
   EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
  EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,0);
  ExWB1.ConnectTo(ExAP1.ActiveWorkbook);
  ExWS1.ConnectTo(ExWB1.Sheets.item['Sheet1'] as _Worksheet);



//    Excel.Worksheets['Tabelle1'].Activate;  // Test-Bereich anlegen.
    for i := 0 to 10 do
    begin
      ExWS1.cells.Item[i+5, 2]:= 'Zeile'+ inttostr(i);
      ExWS1.cells.Item[i+5, 3]:= 'Zeile1'+ inttostr(i);
    end;
//    Excel.Worksheets['Sheet1'];
    ExWS1.Range['B5:C15',null].Name := 'Test';        // Bereich Test einrichten



    Zeilen:= ExWS1.range['Test',null].rows.count;     // Anzahl Zeilen im Bereich
    Spalten:= ExWS1.range['Test',null].columns.count; // Anzahl Spalten im Bereich
    OleArray:=VarArrayCreate([Spalten,Zeilen],varVariant); // dyn. Array
    OleArray:= ExWs1.Range['Test',null].cells;        // Range-Obj nach OleArray
                                                  // übertragen
    for z := 1 to Zeilen do                      // den Bereich anzeigen.
    begin
      for s := 1 to Spalten do
      begin
        Rueckgabe:= OleArray.item[z,s].value;
        ShowMessage('Laß mal sehen: '+ Rueckgabe);
      end;
    end;
end;

end.
In der Zeile:
Delphi-Quellcode:
    OleArray:= ExWs1.Range['Test',null].cells;        // Range-Obj nach OleArray
kommt die Fehlermeldung:
Zitat:

[Fehler] Unit1.pas(56): E2010 Inkompatible Typen: 'dynamic array' und 'ExcelRange'
Vielleicht kann mir jemand weiterhelfen?

Gruß, Linkat

shmia 13. Feb 2008 12:49

Re: Zugriff auf eine Excel-Zelle mit Namen
 
Delphi-Quellcode:
var
  // OLEArray     : Array of oleVariant; // Falsch
  OLEArray        : OleVariant; // Richtig

   // OleArray:=VarArrayCreate([Spalten,Zeilen],varVariant); // Falsch, einfach weglassen


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 Uhr.
Seite 1 von 2  1 2      

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