Erste leere Zelle in Zeile

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

Moderator: Moderatoren

Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Erste leere Zelle in Zeile

Beitrag von Jörg »

Hallo Fachleute,
zusätzlich zu nachfolgendem Code hätte ich gern noch die erste leere Zelle in der Zeile angesprochen.
Zu beachten wäre dabei, daß in einigen Spalten Formeln stehen, die nicht immer einen Wert liefern, also scheinbar leer sind.

Code: Alles auswählen

sub kopieren
 odoc = ThisComponent
        osheet = odoc.sheets(0)
        orange = osheet.getCellRangeByName("A1:M1")
        orangeAddress = orange.getrangeaddress
        odata()= orange.getdataarray
        oZielSheet = oDoc.sheets(1)
        c = oZielSheet.getCellRangeByName("A1:A12000").queryEmptyCells
        oZielCell = c(0).getcellbyposition(0,0)
        oZielCellAddress = oZielCell.getcelladdress
        X1=oZielCellAddress.column
        Y1=oZielCellAddress.row
        X2=oZielCellAddress.column+(orangeAddress.EndColumn-orangeAddress.StartColumn)
        Y2=oZielCellAddress.Row+(orangeAddress.EndRow-orangeAddress.StartRow)
        oZielrange=oZielSheet.getCellRangeByPosition(X1,Y1,X2,Y2)
        oZielrange.setdataarray(odata())

end sub
Vielen Dank für Eure Hinweise.
Gruß Jörg
Gruß Jörg

Win 10 Pro AOO 4.1.15
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Erste leere Zelle in Zeile

Beitrag von Jörg »

Hab beim Andrew Pitonyak
nachstehenden Code gefunden, der mir aber die nichtleeren Zellen in einem Bereich zeigt, aber alle "belegten" Zellen berücksichtigt.

Gruß Jörg

Code: Alles auswählen

Function NonEmptyCellsInRange(oRange, sep$) As String
Dim oCell 'Die zu verwendende Zelle.
Dim oRanges 'Die nach der Zellabfrage zurückgegebenen Bereiche.
Dim oAddrs() 'CellRangeAddress-Array der Adressen der Zellbereiche.
Dim oAddr 'Eine einzelne Bereichsadresse.
Dim oSheet 'Tabellenblatt, das den Zellbereich enthält.
Dim i As Long 'Indexvariable.
Dim nRow As Long 'Zeilennummer.
Dim nCol As Long 'Spaltennummer.
Dim s As String
REM Zuerst werden die Zellen im Bereich gesucht, die nicht leer sind.
REM Dabei wird eine Zelle als nicht leer betrachtet, die entweder
REM einen Wert, einen String, eine Formel oder Datum/Uhrzeit enthält.
oRanges = oRange.queryContentCells(_
com.sun.star.sheet.CellFlags.VALUE OR _
com.sun.star.sheet.CellFlags.DATETIME OR _
com.sun.star.sheet.CellFlags.STRING OR _
com.sun.star.sheet.CellFlags.FORMULA)
oAddrs() = oRanges.getRangeAddresses()
For i = 0 To UBound(oAddrs())
REM Eine spezifische Bereichsadresse.
oAddr = oAddrs(i)
For nRow = oAddr.StartRow To oAddr.EndRow
For nCol = oAddr.StartColumn To oAddr.EndColumn
oCell = oRange.Spreadsheet.getCellByPosition(nCol, nRow)
s = s & oCell.AbsoluteName & sep$
Next
Next
Next
NonEmptyCellsInRange = s
End Function
Gruß Jörg

Win 10 Pro AOO 4.1.15
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Erste leere Zelle in Zeile

Beitrag von TrueColor »

Jörg hat geschrieben:

Code: Alles auswählen

[...]
oRanges = oRange.queryContentCells(_
com.sun.star.sheet.CellFlags.VALUE OR _
com.sun.star.sheet.CellFlags.DATETIME OR _
com.sun.star.sheet.CellFlags.STRING OR _
com.sun.star.sheet.CellFlags.FORMULA)
[...]
Nützt dir vlt. die Verwendung von CellContentType etwas?

aus https://wiki.openoffice.org/wiki/Docume ... and_Ranges

Code: Alles auswählen

Dim Doc As Object
Dim Sheet As Object
Dim Cell As Object
 
Doc = ThisComponent
Sheet = Doc.Sheets(0)
Cell = Sheet.getCellByPosition(1,1)
 
Cell.Value = 1000
 
Select Case Cell.Type 
Case com.sun.star.table.CellContentType.EMPTY 
   MsgBox "Content: Empty"
[...]
System:
LibO 6 + LibO 7
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Erste leere Zelle in Zeile

Beitrag von Jörg »

Hallo,
vielen Dank für die Antwort.
Komme aber leider nicht weiter.
Dein Code überschreibt mir lediglich die Zelle B1.

Gruß Jörg
Gruß Jörg

Win 10 Pro AOO 4.1.15
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Erste leere Zelle in Zeile

Beitrag von komma4 »

Ein Bereich hat die Methode .queryEmptyCells() - die liefert ein Array von Zell-Objekten zurück.
Daraus kannst Du eine Eigenschaft abfragen, im folgenden Beispiel wird der Name des ersten Fundstücks zurüc- und ausgegeben.

Nutze die Extension MRI zur Untersuchung der Objekte Deiner Programmierversuche!

Code: Alles auswählen

SUB de65977
' 20150701
' find empty cell in a row
' (not having a value, string or formula)

doc = ThisComponent
sheet = doc.Sheets.getByName("Tabelle2")
range = sheet.getCellRangeByName("A1:M1")

IF NOT IsNull(firstEmptyCellInRange(range)) THEN
   print firstEmptyCellInRange(range)
END IF 

END SUB



FUNCTION firstEmptyCellInRange(rng)

result = rng.queryEmptyCells()

IF result.hasElements() THEN
   firstEmptyCellInRange = result.ElementNames(0)
ELSE 
   firstEmptyCellInRange = Null
END IF

END FUNCTION

Hilft das weiter?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Erste leere Zelle in Zeile

Beitrag von TrueColor »

Dein Code überschreibt mir lediglich die Zelle B1.
Sry, ich habe mich wohl etwas zu kurz gefasst. Bezogen auf deine Abfrage der 4 verschiedenen Cellflags (weswegen ich genau diesen Abschnitt zitiert hatte ;-)), wo du eigentlich wissen willst, ob die Zelle EMPTY ist, wollte ich dir vorschlagen, zu prüfen, ob das evtl. mit CellContentType.EMPTY zu lösen wäre (siehe Link). Der Code ist ein Auszug von der Seite, der zeigt, wie CellContentType.EMPTY verwendet werden kann.

Edit: Zitat eingefügt, da Komma4 schneller war
System:
LibO 6 + LibO 7
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Erste leere Zelle in Zeile

Beitrag von Jörg »

Hallo, tut mir wirklich leid, aber ich kriegs nicht hin. :oops:

Code: Alles auswählen

Sub fuellen

 odoc = ThisComponent
 sheet = odoc.sheets(1)
   oStammSheet = ThisComponent.sheets.getByName("Tabelle2")
      With oStammSheet ' Letzte Zeile der Spalte AI,AJ,AK im 2. Tabellenblatt ermitteln
         x = .Columns("34:35").queryEmptyCells()
         iLetzteZeile = x(x.Count-1).RangeAddress.StartRow +1
      End With

         mycell = oStammSheet.getCellRangeByName("AI" & iLetzteZeile )
         mycell.FormulaLocal  = "=test"
 mycell = oStammSheet.getCellRangeByName("AJ" & iLetzteZeile )
         mycell.FormulaLocal  = "=test"
 mycell = oStammSheet.getCellRangeByName("AK" & iLetzteZeile )
         mycell.FormulaLocal  = "=test"
End Sub'
Mit diesem Code bin ich in der entsprechenden Zeile (hier die letzte).
Jetzt suche ich nach einer Möglichkeit ans Ende dieser Zeile zu gelangen, um dann dort ebenfalls einen Eintrag vorzunehmen. wobei eben zwischen AK1
und der letzten belegten Zelle, Zellen mit Formeln stehen (also nicht wirklich leer sind).
Danke schon mal.
Gruß Jörg
Gruß Jörg

Win 10 Pro AOO 4.1.15
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Erste leere Zelle in Zeile

Beitrag von komma4 »

Wie jetzt.... die erste leere Zelle in einer Zeile, oder in einer Spalte?

Code: Alles auswählen

range = sheet.getCellRangeByName("AI1:AI9999")

IF NOT IsNull(EmptyCellsInRange(range)) THEN

   addresses = EmptyCellsInRange(range)
   
   adr = addresses(0)
   cell = sheet.getCellByPosition(adr.StartColumn, adr.StartRow)
   cell.setString("Dies ist die erste leere Zelle in dieser Spalte (gewesen!)")   

END IF 


FUNCTION EmptyCellsInRange(rng)
' returns the first CellRange of empty cell(s) in given range

result = rng.queryEmptyCells()

IF result.hasElements() THEN
    EmptyCellsInRange = result.RangeAddresses(0)
ELSE 
    EmptyCellsInRange = Null
END IF

END FUNCTION
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Erste leere Zelle in Zeile

Beitrag von Jörg »

Hallo,
Jetzt suche ich nach einer Möglichkeit ans Ende dieser Zeile zu gelangen, um dann dort ebenfalls einen Eintrag vorzunehmen.
Mein Anliegen :
1.ich führe das Makro aus:

Code: Alles auswählen

Sub fuellen

 odoc = ThisComponent
 sheet = odoc.sheets(1)
   oStammSheet = ThisComponent.sheets.getByName("Tabelle2")
      With oStammSheet ' Letzte Zeile der Spalte AI,AJ,AK im 2. Tabellenblatt ermitteln
         x = .Columns("34:35").queryEmptyCells()
         iLetzteZeile = x(x.Count-1).RangeAddress.StartRow +1
      End With

         mycell = oStammSheet.getCellRangeByName("AI" & iLetzteZeile )
         mycell.FormulaLocal  = "=test"
 mycell = oStammSheet.getCellRangeByName("AJ" & iLetzteZeile )
         mycell.FormulaLocal  = "=test"
 mycell = oStammSheet.getCellRangeByName("AK" & iLetzteZeile )
         mycell.FormulaLocal  = "=test"
End Sub'
2. in iletzteZeile GoRightToEndof Data, dann
3. GoRight = leere Zelle
-----------------------------------
4. in diese leere Zelle per Makro schreiben.

Hoffe, mich verständlicher ausgedrückt zu haben.
Wenn nicht, bitte fragen.
Gruß Jörg
Gruß Jörg

Win 10 Pro AOO 4.1.15
Antworten