Erste leere Zelle in Zeile

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: Erste leere Zelle in Zeile

Re: Erste leere Zelle in Zeile

von Jörg » Do, 02.07.2015 15:43

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

Re: Erste leere Zelle in Zeile

von komma4 » Mi, 01.07.2015 21:28

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

von Jörg » Mi, 01.07.2015 20:54

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

Re: Erste leere Zelle in Zeile

von TrueColor » Mi, 01.07.2015 15:47

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

von komma4 » Mi, 01.07.2015 15:46

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

von Jörg » Mi, 01.07.2015 13:49

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

von TrueColor » Mi, 01.07.2015 13:14

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

von Jörg » Mi, 01.07.2015 12:57

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

Erste leere Zelle in Zeile

von Jörg » Mi, 01.07.2015 12:43

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

Nach oben