Seite 1 von 1
Erste leere Zelle in Zeile
Verfasst: Mi, 01.07.2015 12:43
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
Re: Erste leere Zelle in Zeile
Verfasst: Mi, 01.07.2015 12:57
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
Re: Erste leere Zelle in Zeile
Verfasst: Mi, 01.07.2015 13:14
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"
[...]
Re: Erste leere Zelle in Zeile
Verfasst: Mi, 01.07.2015 13:49
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
Re: Erste leere Zelle in Zeile
Verfasst: Mi, 01.07.2015 15:46
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?
Re: Erste leere Zelle in Zeile
Verfasst: Mi, 01.07.2015 15:47
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
Re: Erste leere Zelle in Zeile
Verfasst: Mi, 01.07.2015 20:54
von Jörg
Hallo, tut mir wirklich leid, aber ich kriegs nicht hin.
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
Re: Erste leere Zelle in Zeile
Verfasst: Mi, 01.07.2015 21:28
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
Re: Erste leere Zelle in Zeile
Verfasst: Do, 02.07.2015 15:43
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