Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Die letzte gefüllte Zeile finden (https://www.delphipraxis.net/25688-die-letzte-gefuellte-zeile-finden.html)

sunshine-girl87 10. Jul 2004 14:42


Die letzte gefüllte Zeile finden
 
Hi,

wie kann ich (ja, mal wieder Excel) die letzte beschriebene Zelle mit Hilfe von Delpgi finden?

semo 10. Jul 2004 14:46

Re: Die letzte gefüllte Zeile finden
 
Delphi-Quellcode:
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;
[edit=sakura] [code] durch [delphi] ersetzt Mfg, sakura[/edit]

sunshine-girl87 10. Jul 2004 14:53

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...

semo 10. Jul 2004 14:56

Re: Die letzte gefüllte Zeile finden
 
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;


= aktivieren der letzten Zelle

sunshine-girl87 10. Jul 2004 14:56

Re: Die letzte gefüllte Zeile finden
 
Und warum sollte ich sie aktivieren, oder was ist mit aktivieren gemeint?

semo 10. Jul 2004 14:59

Re: Die letzte gefüllte Zeile finden
 
Zitat:

Hi,
wie kann ich (ja, mal wieder Excel) die letzte beschriebene Zelle mit Hilfe von Delpgi finden?
du aktivierst die Zelle um damit was zu machen oder habe ich deine Frage falsch interpretiert?

sunshine-girl87 10. Jul 2004 15:05

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"...

semo 10. Jul 2004 15:09

Re: Die letzte gefüllte Zeile finden
 
dann einfach die zeile ausgeben nachdem sie aktiviert ist:

ShowMessage(IntToStr(myExcel.ActiveCell.Row));

DP-Maintenance 10. Jul 2004 15:09

DP-Maintenance
 
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Das ist ja eine Delphi Frage ;)

sunshine-girl87 10. Jul 2004 15:55

Re: Die letzte gefüllte Zeile finden
 
Delphi-Quellcode:
procedure TForm4.Button4Click(Sender: TObject);
var myexcel:OleVariant;
begin
  myexcel.CreateObject('Excel.Application');
 ExcelWorkSheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
 ShowMessage(IntToStr(myexcel.ActiveCell.Row));
Das funzt so nicht:

Variante referenziert kein Automatisierungsobjekt

semo 10. Jul 2004 16:06

Re: Die letzte gefüllte Zeile finden
 
Code:
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.
so funktionierts!
auf dem formular ein OpedDialog und ein Button platzieren!

lg marcus

TheMiller 10. Jul 2004 16:34

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;

semo 10. Jul 2004 16:36

Re: Die letzte gefüllte Zeile finden
 
an wen wendest du dich jetzt @DJ-SPM?

TheMiller 10. Jul 2004 16:38

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:
var myExcel:OleVariant;
begin
  myExcel := CreateOleObject('Excel.Application');
ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
ShowMessage(IntToStr(myExcel.ActiveCell.Row));
aber da kommt nur eine Zugriffsverletzung... Ich dreh bald durch

TheMiller 10. Jul 2004 21:11

Re: Die letzte gefüllte Zeile finden
 
hat sonst keiner eine Idee?

TheMiller 10. Jul 2004 23:27

Re: Die letzte gefüllte Zeile finden
 
Sorry, dass ich schon wieder pushe, aber ich brauche gaaanz dringend Hilfe. Bitte verzeiht mir das mal!

TheMiller 10. Jul 2004 23:53

Re: Die letzte gefüllte Zeile finden
 
So,

nachdem ich noch ein bissl probiert habe, kam ich zu folgendem Code:

Delphi-Quellcode:
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;
Doch hier sagt er "Ungütliger Index" und markiert die fett gedruckte Zeile im Code!

xineohp 11. Jul 2004 01:11

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.

semo 11. Jul 2004 09:17

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:

semo 11. Jul 2004 10:18

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?

TheMiller 11. Jul 2004 11:57

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...

semo 11. Jul 2004 12:00

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...

TheMiller 11. Jul 2004 12:48

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:
Druck: 500 Karten 210mm x 180mm, Verpackung
Es soll aber so aussehen:

Delphi-Quellcode:
Druck:
500 Karten 210mm x 180mm
incl. Verpackung
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.

Ist im Prinzip nur eine Formsache, aber das sollte schon sein... *g*

semo 11. Jul 2004 12:51

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!

TheMiller 11. Jul 2004 12:54

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)

TheMiller 11. Jul 2004 13:14

Re: Die letzte gefüllte Zeile finden
 
Bin ein Stück weiter. Ich habe jetzt diesen Code:

Delphi-Quellcode:
a:=ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
ShowMessage(Inttostr(a));
und er zeigt mir immer in der MsgBox -1 an... vielleicht hilft das jemanden...

semo 21. Aug 2004 19:18

Re: Die letzte gefüllte Zeile finden
 
hast du die folgenden units eingebunden?

Code:
OleServer, ExcelXP, ComObj

TheMiller 22. Aug 2004 09:50

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... ;-)

semo 22. Aug 2004 10:05

Re: Die letzte gefüllte Zeile finden
 
wie hast das problem denn "unschön" gelöst?

Duffy 22. Aug 2004 11:05

Re: Die letzte gefüllte Zeile finden
 
Hallo DJ-SPM,
versuch es doch mal so
Delphi-Quellcode:
SelectCell(1, 1);
SelectCurrentRegion;
AnzahlZeilen := Selection.Rows.Count; // Anzahl Zeilen = letzte Zeile
SelectCell(1, 1) // Selektion wieder abwählen
bye
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