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.
Hab beim Andrew Pitonyak
nachstehenden Code gefunden, der mir aber die nichtleeren Zellen in einem Bereich zeigt, aber alle "belegten" Zellen berücksichtigt.
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
[...]
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?
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"
[...]
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!
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)
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.
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
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)