![]() |
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:
Da die Tabelle öfters verändert, sprich verschoben wird, würde ich gern auf die in Excel definierten Namen der Zellen zugreifen.
StringGrid1.Cells[1,2]:=ExWS1.Cells.Item[5,6];
Wer kann mir einen Tipp geben? Vielen Dank! Gruß, Linkat |
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]; |
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:
So oder ähnlich.
sg.Cells[iCol, iRow] := xlSheet.Names.Item('name', null, null).RefersToRange.Cells.Item[0, 0];
Freundliche Grüße |
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:
Das Programm wird ohne Fehlermeldung kompiliert. Aber nach dem Programmstart kommt die Fehlermeldung:
SG1.Cells[1,1]:=ExWS1.Names.Item('LTCC_total',null,null).RefersToRange.Cells.Item[0,0];
Zitat:
Linkat OS WinXP, Excel 2003, Delphi 2005 Pro |
Re: Zugriff auf eine Excel-Zelle mit Namen
Zitat:
![]() Aussdem sollte man die Arbeit in min. 2 Schritten erledigen:
Delphi-Quellcode:
So lässt sich das Problem näher einkreisen, da der Debugger ja auf der fehlerhaften Zeile anhält.
var
tmp : OleVariant; tmp := ExWS1.Names.Item('LTCC_total',null,null); ... SG1.Cells[1,1]:=tmp.RefersToRange.Cells.Item[0,0]; Wenn man die Zellen in einer Schleife ausliest, gibt es auch einen Geschwindigkeitsvorteil. |
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:
Hat noch jemand eine Idee?
tmp:=ExWS1.Names.Item('LTCC_total',null,null);
Gruß, Linkat |
Re: Zugriff auf eine Excel-Zelle mit Namen
Zitat:
Jetzt nimmt man halt noch 'ne Zwischenvariable:
Delphi-Quellcode:
Tipp: Excel VBA-Hilfe aufrufen:
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); in Excel ALT-F11 gefolgt von F1 drücken. |
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 |
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:
In der Zeile:
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.
Delphi-Quellcode:
kommt die Fehlermeldung:
OleArray:= ExWs1.Range['Test',null].cells; // Range-Obj nach OleArray
Zitat:
Gruß, Linkat |
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 21:14 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