Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von Toxitom » Mi, 28.09.2022 19:33

Hey zusammen,

dank ein paar netter Hinweise von aktiven Forumsteilnehmern konnte der Code der Funktion "getLastUsedColumnCell()" noch ein wenig verbessert und verküzt/vereinfacht werden.

Will ich Euch nicht vorenthalten :)

Code: Alles auswählen

'/** getLastUsedColumnCell()
'*************************************************************************.
'* @kurztext liefert die letzte benutzte Zelle einer Spalte
'* Die Funktion liefert die letzte benutzte Zelle einer Spalte, die Spalte muss nicht durchgängig
'* befüllt sein.
'*
'* @param1  oSheet as object   die Calc-Tabelle (Tabellenblatt) als objekt
'* @param2  sSpalte as string   die Spaltenbezeichnung - also z.B. "a" oder "ABC"
'*
'* @return  oZelle as object  das Objekt der letzten benutzten Zelle
'*************************************************************************
'*/
function getLastUsedColumnCell(oSheet as object, sSpalte as string)
  dim oZelle as variant    'letzte benutzte Zelle
  dim oBereich as variant  'Zellbereich Spalte
  dim oListe as variant    'Objekt aller unbenutzten Zellen
  
  oBereich = oSheet.Columns.GetByName(sSpalte)
  REM nun zuerst prüfen, ob die letzte Zelle des Bereiches überhaupt leer ist - sonst Zelle Zurückliefern
  if NOT (oSheet.getCellByPosition(0, oBereich.RangeAddress.endRow).type = 0) then
   oZelle = oBereich.getCellByPosition(0, oBereich.RangeAddress.endRow)
  
  else
    REM jetzt alle Leeren Zellen abrufen und den letzten Eintrag wählen und auswerten
    oListe = oBereich.queryEmptyCells()
    REM Letzter Zellbereich, erste Zelle
    oZelle = oBereich.getCellByPosition(0,oListe(Ubound(oListe.RangeAddresses)).RangeAddress.StartRow-1)
  end if
  
  GetLastUsedColumnCell = oZelle
end function
Danke den Helfern und dem konstruktiven Inputs.

VG Tom

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von Toxitom » Mi, 28.09.2022 16:18

Ich habe noch mal einwenig gebastelt und eine allgemeinere Funktion erstellt, die die letzte benutzte Zelle einer Spalte zurückliefert.

Das wäre dann unabhängig von einem Cursor und dem Datenbereich und ist recht perform durch Verzicht auf Iterationen mit Hilfe einer Schleife.
Die Daten der Spalte können auch Lücken haben - es wird immer die letzte benutzte Zelle zurückgeliefert.

Der Code könnte noch kürzer sein, doch werden die beiden sehr unwahrscheinlichen Fälle mit behandelt: Die Spalte ist bis zum Ende gefüllt und nur die letzte Zeile ist leer....

Vielleicht kann es ja jemand brauchen:

Code: Alles auswählen

'/** getLastUsedColumnCell()
'*************************************************************************.
'* @kurztext liefert die letzte benutzte Zelle einer Spalte
'* Die Funktion liefert die letzte benutzte Zelle einer Spalte, die Spalte muss nicht durchgängig
'* befüllt sein.
'*
'* @param1  oSheet as object   die Calc-Tabelle (Tabellenblatt) als objekt
'* @param2  sSpalte as string   die Spaltenbezeichnung - also z.B. "a" oder "ABC"
'*
'* @return  oZelle as object  das Objekt der letzten benutzten Zelle
'*************************************************************************
'*/
function getLastUsedColumnCell(oSheet as object, sSpalte as string)
  dim oZelle as variant    'letzte benutzte Zelle
  dim oBereich as variant  'Zellbereich Spalte
  dim oListe as variant    'Objekt aller unbenutzten Zellen
  dim oLztBereich as Variant  'letzer leerer Zellbereich oder letze leere Zelle 
  
  oBereich = oSheet.getCellRangeByName(sSpalte & ":" & sSpalte)
  REM nun zuerst prüfen, ob die letzte Zelle des Bereiches überhaupt leer ist - sonst Zelle Zurückliefern
  if NOT (oSheet.getCellByPosition(oBereich.RangeAddress.startColumn, oBereich.RangeAddress.endRow).type = 0) then
   oZelle = oSheet.getCellByPosition(oBereich.RangeAddress.startColumn, oBereich.RangeAddress.endRow)
  
  else
    REM jetzt alle Leeren Zellen abrufen und den letzten Eintrag wählen und auswerten
    oListe = oBereich.queryEmptyCells()
    oLztBereich = oListe(ubound(oListe.getElementNames))
    REM Unterscheidung ob einzelne Zelle oder Zellbereich
    if oLztBereich.supportsService("com.sun.star.sheet.SheetCell") then  'einzelne Zelle (wäre die letzte Zelle der Spalte - sehr unwahrscheinlich!)
      oZelle = oSheet.getCellByPosition(oLztBereich.CellAddress.Column, oLztBereich.CellAddress.Row-1)
    elseif oLztBereich.supportsService("com.sun.star.sheet.SheetCellRange") then  'Zellbereich  (die wahrscheinlichste option!)
      oZelle = oSheet.getCellByPosition(oLztBereich.RangeAddress.startColumn, oLztBereich.RangeAddress.startRow-1)
    end if
  end if
  
  GetLastUsedColumnCell = oZelle
end function
Der Aufruf hier in dem besprochenen Fall wäre dann zum Beispiel:

Code: Alles auswählen

sub test_LetzteZelle
  oSheet = ThisComponent.sheets.getbyName("Neu")
  oZelle = GetLastUsedColumnCell(oSheet,"D")
  msgbox oZelle.string
end sub 
VG Tom

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von Karolus » Mo, 26.09.2022 13:29

Ich bringe auch Geduld mit für Leute die KONSTRUKTIV mitarbeiten, und
auf den Trichter
mit dem Cursor kannste mal im noch taufrischen Thema direkt unterhalb nachlesen.

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von kalle05 » Mo, 26.09.2022 12:45

Hallo Tom,
erst einmal vielen Dank für deine Hilfe.
Mit dem Cursor habe ich schon gearbeitet, nur auf diesen Trichter bin ich nicht gekommen.
Fremd war mir diese Zeile, aber im Nachhinein verständlich.

Code: Alles auswählen

iLetzteZeileIndex = oCur.RangeAddress.endRow
Der Code funktioniert tadellos und ich kann mich nun an die Arbeit machen.
Schön, dass es Leute wie dich gibt, die mit einem Anfänger Geduld aufbringen.
Schönen Gruß
Kalle

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von Toxitom » Mo, 26.09.2022 12:29

Hey Kalle,

hmm, na ja, da wirst Du Dich schon noch ein wenig tiefer mit der kompletten Materie beschäftigen müssen.

Ja, es ist möglich, die letzet benutzte Zeile auszulesen - aus einem definierten Zellbereich oder aus dem kompletten Tabellenblatt.

Dann brauchst Du einen Cursor (Tabellenblatt-Cursor) und Erfahrung im Arbeiten mit Indices und Bereichen.

Der Code würde dann wie folgt aussehen (habe Deinen Code im Module 1 in der Bibliothek "Password" verwendet und ergänzt):

Code: Alles auswählen

Dim oDlg1 as Object
Dim oDoc as Object, oSheet as Object
Dim Cell

 Sub oDlg1Dialog_aufrufen()
  Dim oCur as variant
  dim iLetzteZeileIndex as long
  
  DialogLibraries.LoadLibrary( "Passwort" )
  oDlg1 = CreateUnoDialog( DialogLibraries.Passwort.DlgHauptdialog)
  oDlg1.Model.Step = 1

  oDoc = ThisComponent
  oSheet = ThisComponent.sheets.getbyName("Neu")
   
  REM Blattcursor erzeugen
  oCur = oSheet.createCursor()
  REM zur letzen benutzen Zelle gehen
  oCur.gotoEndofUsedArea(false)
  REM letzte benutzte Zeile
  iLetzteZeileIndex = oCur.RangeAddress.endRow
 
  'Abfahrt = oSheet.getCellRangeByName("D"& iLetzteZeileIndex +1).value 
  oDlg1.getcontrol("kmAbf").value = oSheet.getCellRangeByName("D"& iLetzteZeileIndex +1).value	  
  oDlg1.Execute()  
End Sub
Der Blattcursor verwendet immer die letzte benutzte Zeile - solltest Du also irgendetwas unterhalb der aktuellen Zeile geschrieben haben, läuft das natürlich schief;) Und natürlich auch bei einer leeren Tabelle - da würde dann ja die Überschrift genutzt werden. Also, da musste noch einiges daran arbeiten;)
Aber so siehste erst mal wie das umsetzbar wäre...

VG Tom

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von kalle05 » Mo, 26.09.2022 09:40

So nun ein wenig ausführlicher.
Ich als Lehrnender kann natürlich nicht wissen, was für Spezifikationen genannt werden müssen, die nicht aus dem Code-Schniptsel ersichtlich sind.
Das Fahrtenbuch, häufig genug im Forum genannt, dient unter anderem dazu, die gefahrenen Kilometer zu ermitteln. Es werden für die Berechnung dieser Kilometer zwei Nummernfelder benötigt. Dabei erscheint zunächst der Anfangskilometerstand im Dialog als Nummernfeld ( kmAbf) durch Auslesen der letzten Zelle einer Spalte.
Genau dieses Erscheinen will ich in meinem Nummernfeld der Spalte D erreichen.

Aufgrund der vielen Zugriffe scheint ja auch ein deutliches Interesse zu bestehen.


Anbei ein Beispiel.
Neu.ods
(19.89 KiB) 77-mal heruntergeladen
Hier der Link für das Fahrtenbuch:
viewtopic.php?f=18&t=1553
Hallo Tom,
ich habe MRI installiert und versuche mich daran. Wie gesagt, ich versuche. Etwas sinnhaftes ist für mich nicht herausgekommen, so dass ich mich an das Forum gewandt habe.
Gruß Kalle

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von Toxitom » Mo, 26.09.2022 08:16

hey Kalle,

da wirste Du halt schon ein wenig mehr Code posten müssen.

Die "Exception" kann z.B. auch dann auftreten, wenn "oSheet" nicht oder nicht korrekt definiert ist.

Der Code des Fahrtenbuchs ist allerdings auch schon ziemlich alt .. dort aber sind die Tabellenblätter in einer eigenen Funktion definiert. Wenn Du davon abweichend eigene Ideen realisiert, dann versuche auch zu lernen, wie das alles zusammenhängt.

Und... wie Karolus schon durchaus korrekt festgestellt hat: Nutze selbst mögliche Analysemethoden (print, msgox, xray) um auftretende Fehler einzugrenzen und selbst zu analysieren.

Ich kann auch nicht sehen, was in "iLetzteZeile" steht oder was "oSheet" beinhaltet....

VG Tom

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von Karolus » Sa, 24.09.2022 15:10

Nee kenn ich nicht, muss ich auch nicht, und würde hier keinen Furz helfen, weil du derjenige bist der es irgendwie verbockt hat, und nicht das Fahrtenbuch als Vorlage.

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von kalle05 » Sa, 24.09.2022 15:02

Du scheinst ja noch nicht einmal das Fahrtrenbuch von Tom zu kennen.

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von Karolus » Sa, 24.09.2022 15:00

Dann steckt wohl in iletzteZeile ein falscher Wert|String … du bist derjenige der das mit einem print iletzteZeile herausfinden kannst.

Ich bin jetzt raus, ich hab keine Lust einem Vollhonk jeden Popel aus der Nase zu ziehen.

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von kalle05 » Sa, 24.09.2022 14:51

Nachdem ich bei "D" die 1 weggenommen habe.
nNeueDatSatz = oSheet.getCellRangeByName("D" & iLetzteZeile).value
Gruß
Kalle

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von Karolus » Sa, 24.09.2022 14:48

kalle05 hat geschrieben: Sa, 24.09.2022 14:44 Ja, hast Recht.
Die Fehlermeldung lautet: Es ist eine Exception aufgetreten.
und wo ist die aufgetreten ???
Bitte den Quellcode mit der markierten Zeile.

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von kalle05 » Sa, 24.09.2022 14:44

Ja, hast Recht.
Die Fehlermeldung lautet: Es ist eine Exception aufgetreten.

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von Karolus » Sa, 24.09.2022 14:40

Dann solltest du mal deinen Kram selbst debuggen***, mit der Aussage
funktioniert nicht
kann dir da keiner helfen.

***vielleicht mal mit print iLetzteZeile nachschauen ob das die gewünschte ist.

Re: Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

von kalle05 » Sa, 24.09.2022 14:20

Hallo Karolus
ja, wenn das so einfach wäre. Mit anderen Worten: Dein Vorschlag funktioniert nicht.
GrußKalle

Nach oben