Calc Im Dialog letzte Zelle auslesen und im Textfeld ausgeben

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

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

Beitrag von Toxitom »

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

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

Beitrag von Toxitom »

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Antworten