![]() |
Die letzte gefüllte Zeile finden
Hi,
wie kann ich (ja, mal wieder Excel) die letzte beschriebene Zelle mit Hilfe von Delpgi finden? |
Re: Die letzte gefüllte Zeile finden
Delphi-Quellcode:
[edit=sakura] [code] durch [delphi] ersetzt Mfg, sakura[/edit]
try
// Create Excel-OLE Object myExcel := CreateOleObject('Excel.Application') except ShowMessage('Excel konnte nicht gestartet werden!'); exit end; // Excel verbergen myExcel.Visible := false; // Öffnen der gewählten Arbeitsmappe myExcel.Workbooks.Open(NAME DER DATEI); Sheet := myExcel.Workbooks[ExtractFileName(NAME DER DATEI)].WorkSheets[1]; // aktivieren der letzten Zelle Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; // Laden der Spalte 1 in eine Liste // Laden der Spalte 2 in eine zweite Liste for zeile:=1 to myExcel.ActiveCell.Row do begin EnglischList.Add(myExcel.Cells[zeile, 1].Value); DeutschList.Add(myExcel.Cells[zeile, 2].Value) end; |
Re: Die letzte gefüllte Zeile finden
das funzt nicht. Undefinierter bezeichner CreateOleObject, obwohl myExcel eine var vom Typ OleVariant ist. Sie kann kein Typ von OleOBject sein.
Außerdem finde ich da doch nicht die letzte Reihe, in der Werte drinstehen. Mit "add" füge ich ja werte hinzu, das will ich nicht. Dieser Code sieht mir ein bissl seltsam aus... |
Re: Die letzte gefüllte Zeile finden
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
= aktivieren der letzten Zelle |
Re: Die letzte gefüllte Zeile finden
Und warum sollte ich sie aktivieren, oder was ist mit aktivieren gemeint?
|
Re: Die letzte gefüllte Zeile finden
Zitat:
|
Re: Die letzte gefüllte Zeile finden
Mein Programm soll die letzte Excel-Zelle finden, die beschrieben ist. Dabei handelt es sich immer um 1 Spalte. So, wenn es die gefunden hat, dann soll es sagen: Die letzte Zelle mit einem Wert ist die Zelle "Bxx"...
|
Re: Die letzte gefüllte Zeile finden
dann einfach die zeile ausgeben nachdem sie aktiviert ist:
ShowMessage(IntToStr(myExcel.ActiveCell.Row)); |
DP-Maintenance
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Das ist ja eine Delphi Frage ;) |
Re: Die letzte gefüllte Zeile finden
Delphi-Quellcode:
Das funzt so nicht:
procedure TForm4.Button4Click(Sender: TObject);
var myexcel:OleVariant; begin myexcel.CreateObject('Excel.Application'); ExcelWorkSheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; ShowMessage(IntToStr(myexcel.ActiveCell.Row)); Variante referenziert kein Automatisierungsobjekt |
Re: Die letzte gefüllte Zeile finden
Code:
so funktionierts!
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleServer, ExcelXP, COmObj; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; ExcelApplication1: TExcelApplication; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } function ermittleLetzteSpalteDerExcelDatei(dateiname: string): Integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then ShowMessage(IntToStr(ermittleLetzteSpalteDerExcelDatei(OpenDialog1.FileName))); end; function TForm1.ermittleLetzteSpalteDerExcelDatei(dateiname: string): Integer; var myExcel, sheet: OLEVariant; zeile: Integer; begin if dateiname <> '' then begin try // Create Excel-OLE Object myExcel := CreateOleObject('Excel.Application') except ShowMessage('Excel konnte nicht gestartet werden!'); exit end; // Excel verbergen myExcel.Visible := false; // Öffnen der gewählten Arbeitsmappe myExcel.Workbooks.Open(dateiname); // Sheet := XLApp.Workbooks[1].WorkSheets[1]; Sheet := myExcel.Workbooks[ExtractFileName(dateiname)].WorkSheets[1]; // In order to know the dimension of the WorkSheet, i.e the number of rows // and the number of columns, we activate the last non-empty cell of it Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; //myExcel.ActiveCell.Row; Result := myExcel.ActiveCell.Row; // Excel wieder schließen myExcel.DisplayAlerts := False; myExcel.Quit; myExcel := Unassigned; Sheet := Unassigned; end; end; end. auf dem formular ein OpedDialog und ein Button platzieren! lg marcus |
Re: Die letzte gefüllte Zeile finden
Habe den Code jetzt so abgeändert, da die Excel-Datei schon bekannt, geöffnet und in Gebrauch ist. Die Fehlermeldung lautet:
Ungültiger Index.
Delphi-Quellcode:
var
myExcel, sheet: OLEVariant; zeile: Integer; begin myExcel := CreateOleObject('Excel.Application'); // Sheet := XLApp.Workbooks[1].WorkSheets[1]; Sheet := myExcel.Workbooks[ExtractFilePath(ParamStr(0))+'Mappe1.xls'].WorkSheets[1]; // In order to know the dimension of the WorkSheet, i.e the number of rows // and the number of columns, we activate the last non-empty cell of it Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; //myExcel.ActiveCell.Row; Result := myExcel.ActiveCell.Row; // Excel wieder schließen myExcel.DisplayAlerts := False; myExcel.Quit; myExcel := Unassigned; Sheet := Unassigned; end; |
Re: Die letzte gefüllte Zeile finden
an wen wendest du dich jetzt @DJ-SPM?
|
Re: Die letzte gefüllte Zeile finden
Achso, du weist das ja nicht... sunshine-girl ist meine Freundin. Ich war bei ihr und habe unter ihrem namen gepostet. Wir haben also die ganze Zeit miteinander geredet.
Habe es jetzt nochmal so probiert:
Delphi-Quellcode:
aber da kommt nur eine Zugriffsverletzung... Ich dreh bald durch
var myExcel:OleVariant;
begin myExcel := CreateOleObject('Excel.Application'); ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; ShowMessage(IntToStr(myExcel.ActiveCell.Row)); |
Re: Die letzte gefüllte Zeile finden
hat sonst keiner eine Idee?
|
Re: Die letzte gefüllte Zeile finden
Sorry, dass ich schon wieder pushe, aber ich brauche gaaanz dringend Hilfe. Bitte verzeiht mir das mal!
|
Re: Die letzte gefüllte Zeile finden
So,
nachdem ich noch ein bissl probiert habe, kam ich zu folgendem Code:
Delphi-Quellcode:
Doch hier sagt er "Ungütliger Index" und markiert die fett gedruckte Zeile im Code!
procedure TForm4.Button4Click(Sender: TObject);
const xlCellTypeLastCell = $0000000B; var myExcel, sheet:OleVariant; a:Integer; begin myExcel := CreateOleObject('Excel.Application'); [b]Sheet:=myExcel.Workbooks[ExtractFileName(ParamStr(0))+('Mappe1.xls')].Worksheet[1];[/b] a:=Sheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate; ShowMessage(IntToStr(a)); end; |
Re: Die letzte gefüllte Zeile finden
moin,
ist nur mal so geraten: hast dus schon mal mit Worksheet[0] probiert? soll ja vorkommen, das der Index bei 0 anfängt und das ist ja hier der einzige Index weit und breit. |
Re: Die letzte gefüllte Zeile finden
wird nicht funktionieren....
in excel beginnt der index immer bei 1: egal ob zelle, worksheet, dateiname (mappe1.xls).... :wink: |
Re: Die letzte gefüllte Zeile finden
also damit ich richtig verstehe: du hast excel bereits geöffnet und auch eine gefüllte Mappe geladen?
oder willst du excel öffnen unter angabe einer datei und daraus was laden bzw die letzte zeile angeben lassen? was willst du denn überhaupt damit machen wenn man fragen darf? |
Re: Die letzte gefüllte Zeile finden
Also,
ich habe excel geöffnet, eine Mappe geöffnet und Zeilen eingetragen. Jetzt kommt ein Teil in Spalte B, in dem User sagen können was drin stehen soll. Jetzt ist es so, dass der eine Eintrag 4 Zeilen belegt. Und der nächste ausgewählte Eintrag zB. 2 Zeilen bruacht. Damit da immer eine Lücke von einer Zeile entsteht möchte ich die Letzte Zeile auffinden und dann in der nächsten Zeile + einer Zeile Leerraum den nächsten vordefinierten Eintrag eintragen lassen. Wenn ich das mit festen Zeilennummern mache habe ich ja Absätze, die mal 4 und mal 2 Zeilen groß sind. Das ist mein Problem... |
Re: Die letzte gefüllte Zeile finden
wieso belegt ein eintrag 2 bzw 4 zeilen? kannst das nicht alles in eine zeile bringen? mach mal n screenshot...
|
Re: Die letzte gefüllte Zeile finden
Natürlich ginge es auch in einer Zeile. Doch es kommt auch die Formatierung an.
Es könnte so aussehen:
Delphi-Quellcode:
Es soll aber so aussehen:
Druck: 500 Karten 210mm x 180mm, Verpackung
Delphi-Quellcode:
So, das ist jetzt eine Vorlage, die der User auswählen kann. Sie hat jetzt 3 Zeilen. Eine andere hat dagegen nur 2 oder 4 Zeilen. Dann habe ich wieder große Lücken.
Druck:
500 Karten 210mm x 180mm incl. Verpackung Ist im Prinzip nur eine Formsache, aber das sollte schon sein... *g* |
Re: Die letzte gefüllte Zeile finden
und das muss man alles in excel direkt auswählen können? warum machst du das nicht in deinem delphiporgramm? nimm nen stringgrid, lasse zeilenumbrüche innerhalb einer zelle zu und speicher das dann als xls-Datei ab!
|
Re: Die letzte gefüllte Zeile finden
Naja,
wollte das eigentlich schon alles in Excel machen, da ich schon das komplette Programm an Excel angeglichen habe. Es kann doch nicht schwer sein, die letzte Zeile auszulesen... Habe es soweit, dass es sagt: Ungültiger Index... Also muss er doch was probieren. Wie bekomme ich denn den Index heraus?? (Sollte schon in Excel sein) |
Re: Die letzte gefüllte Zeile finden
Bin ein Stück weiter. Ich habe jetzt diesen Code:
Delphi-Quellcode:
und er zeigt mir immer in der MsgBox -1 an... vielleicht hilft das jemanden...
a:=ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
ShowMessage(Inttostr(a)); |
Re: Die letzte gefüllte Zeile finden
hast du die folgenden units eingebunden?
Code:
OleServer, ExcelXP, ComObj
|
Re: Die letzte gefüllte Zeile finden
Ja, die Units sind eingebunden.
Ich habe das Problem zwar gelöst, ist aber nicht die feine Art. Wer noch Ideen hat, ich bin offen dafür... ;-) |
Re: Die letzte gefüllte Zeile finden
wie hast das problem denn "unschön" gelöst?
|
Re: Die letzte gefüllte Zeile finden
Hallo DJ-SPM,
versuch es doch mal so
Delphi-Quellcode:
bye
SelectCell(1, 1);
SelectCurrentRegion; AnzahlZeilen := Selection.Rows.Count; // Anzahl Zeilen = letzte Zeile SelectCell(1, 1) // Selektion wieder abwählen Claus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 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-2025 by Thomas Breitkreuz