AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Zugriff auf eine Excel-Zelle mit Namen
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf eine Excel-Zelle mit Namen

Ein Thema von Linkat · begonnen am 6. Feb 2008 · letzter Beitrag vom 14. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Linkat

Registriert seit: 3. Dez 2004
Ort: nr Stuttgart
62 Beiträge
 
Delphi 2009 Professional
 
#1

Zugriff auf eine Excel-Zelle mit Namen

  Alt 6. Feb 2008, 10:39
Hallo,
ich hole mir Daten aus einer Excel-Tabelle und lade sie in ein StringGrid. Dies funktioniert mit Row- und Colum Number so:

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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Zugriff auf eine Excel-Zelle mit Namen

  Alt 6. Feb 2008, 12:22
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];
Andreas
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Zugriff auf eine Excel-Zelle mit Namen

  Alt 6. Feb 2008, 12:50
Hallo ihr beiden,

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

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

Freundliche Grüße
  Mit Zitat antworten Zitat
Linkat

Registriert seit: 3. Dez 2004
Ort: nr Stuttgart
62 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Zugriff auf eine Excel-Zelle mit Namen

  Alt 6. Feb 2008, 15:15
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:

  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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Zugriff auf eine Excel-Zelle mit Namen

  Alt 6. Feb 2008, 15:52
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.
Andreas
  Mit Zitat antworten Zitat
Linkat

Registriert seit: 3. Dez 2004
Ort: nr Stuttgart
62 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Zugriff auf eine Excel-Zelle mit Namen

  Alt 6. Feb 2008, 16:13
Hallo shmia,
danke für den Tipp. Hat aber leider nichts geholfen. Die gleiche Fehlermeldung. Der Debugger springt in die Zeile:

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

Gruß, Linkat
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Zugriff auf eine Excel-Zelle mit Namen

  Alt 6. Feb 2008, 16:31
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Zugriff auf eine Excel-Zelle mit Namen

  Alt 9. Feb 2008, 02:25
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Linkat

Registriert seit: 3. Dez 2004
Ort: nr Stuttgart
62 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Zugriff auf eine Excel-Zelle mit Namen

  Alt 13. Feb 2008, 12:23
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:
    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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: Zugriff auf eine Excel-Zelle mit Namen

  Alt 13. Feb 2008, 12:49
Delphi-Quellcode:
var
  // OLEArray : Array of oleVariant; // Falsch
  OLEArray : OleVariant; // Richtig

   // OleArray:=VarArrayCreate([Spalten,Zeilen],varVariant); // Falsch, einfach weglassen
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:35 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