Seite 1 von 1

Cursor Position in calc Tabelle

Verfasst: Sa, 11.03.2006 09:48
von witchcorp
Hallo,
ich möchte dass der Cursor in einer Calc-Tabelle per Makro auf die Zeile nach der letzten gefüllten Zelle einer bestimmten Spalte gesetzt wird. Bisher habe ich in meinem Formular/Makro

Cursor = oSheet.createCursor()
Cursor.gotoEndOfUsedArea (true)
Zeile = Cursor.getRangeAddress().EndRow

benutzt. Das Funktioniert aber natürlich nicht mehr wenn ich in einer Spalte durchgehend eine Formel hinterlege (logisch, ist ja dann was drin).
Beispiel:
Das Formular trägt in Spalte A das Datum ein, in Spalte B die Positionsnummer und in Spalte C die Anzahl. In Spalte D ist die Formel hinterlegt, die aus der Positionsnummer einen Wert macht mit dem gerechnet werden kann. Das Makro soll jetzt gucken wo in Spalte B der letzte Eintrag war (z.B. b7) und dann den Cursor auf eine Zeile darunter (A8) setzen.

Wie sag ich dem cursor wo er gucken soll?
Bedankt
Bianca

Verfasst: Sa, 11.03.2006 12:19
von Eckhardt
Hallo Bianca,
schau mal in der Makrosammlung von Andrew Pitonyak nach, dort findest Du die Lösung.

???

Verfasst: Sa, 11.03.2006 17:56
von witchcorp
Hallo Eckhardt,
ich kriegs nicht hin hab jetzt den ganzen Nachmittag gesucht und rumprobiert, es will nicht klappen. Wie wäre es mit einem klizekleinwenig präziserem Hinweis wonach ich suchen muss. :(
Bianca

Verfasst: Sa, 11.03.2006 18:31
von Eckhardt
Hallo Bianca,
auf Seite 107 stehen zwei Funktionen, die aus GotoEndOfUsedArea die letzte benutzte Zeile bzw. Spalte extrahieren.
Der Aufruf der Funktion ist im Beispiel ebenfalls beschrieben. Du musst dann nur noch die gewünschte Spalte angeben:

Spalte = oCell.cellAddress.Column 'liest die Spalte der aktuellen Zelle aus
Zeile = getLastUsedRow(oSheet) 'Aufruf der Funktion
oCell = oSheet.GetCellByPosition(Spalte, Zeile + 1) 'Wählt die gewünschte Zelle aus

Function getLastUsedRow(oSheet as Object) as Integer
‘aus Andrews Macro Information Seite 107
Dim oCellUsed As Object
Dim oCursor As Object
Dim aAddress As Variant
oCellUsed = oSheet.GetCellbyPosition( 0, 0 )
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
GetLastUsedRow = aAddress.EndRow
End Function

Verfasst: Sa, 11.03.2006 21:57
von Stephan
die aus GotoEndOfUsedArea die letzte benutzte Zeile bzw. Spalte extrahieren.


nur ich denke gerade darum geht es nicht, weil der Bereich der durch diese Zelle begrenzt wird auch leere Zellen enthalten kann (oder solche mit Formel aber ohne Wert).
Ich denke es geht um die erste Zelle ohne Inhalt einer bestimmten Spalte. (oder ist das mein Irrtum?)

Folgendes ist zunächst variabel, markiere eine Zelle der Spalte die bearbeitet werden soll. Ist es immer Spalte D könnte man das auch fest machen.

Code: Alles auswählen

Sub zelle_suchen()
i = -1
zelle = ThisComponent.getCurrentSelection().getCellAddress().column
blatt = ThisComponent.getCurrentSelection().GetRangeAddress.Sheet
Do
  i = i + 1
  x = ThisComponent.Sheets(blatt).getCellByPosition(zelle,i).Type
Loop While x <> 0
oCtl = ThisComponent.getCurrentController 
'Zelle markiert
oCtl.select( ThisComponent.Sheets(blatt).getCellByPosition(0,i)) 
'evtl. noch das um Zelle nur auszuwählen:
oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
ThisComponent.CurrentController.Select(oRanges)
End Sub
Die gewünschte Zelle in Spalte A wird zunächst nur markiert.


@Bianca
Warum eigentlich trägst Du die Formeln nicht mit einen Makro ein, wenn Du ohnehin eines benutzt?



Gruß
Stephan

Verfasst: Sa, 11.03.2006 23:22
von witchcorp
Hallo Rainer,
das klappt nicht. Der Cursor landet immer noch in der Reihe nach dem letzten Eintrag.
Ich hab jetzt folgendes Makro:

Code: Alles auswählen

REM  *****  BASIC  *****

Private Sub OKButton_Click()
DIM dat As Date
DIM hab As Currency
DIM beschr As String
DIM oCell As Object
Dim oDoc As Object 
Dim oSheet As Object  
Dim oComboBox As Object
Dim oDateField As Object
Dim oCurrencyField As Object
Dim oCursor As Object
Dim nEndCol As Integer
Dim nEndRow As Integer
oDoc = ThisComponent  
oSheet = oDoc.Sheets.GetByName("Formular") 
oForm = oSheet.DrawPage.Forms.GetByName("Standard")    
oDateField = oform.getByName("oDateFieldDatum")
dat = CDateFromIso(oDateField.date)
oSheet = oDoc.Sheets.GetByName("Formular") 
oForm = oSheet.DrawPage.Forms.GetByName("Standard")    
oCurrencyField = oform.getByName("oCurrencyFieldHaben")
hab = oCurrencyField.value
oSheet = oDoc.Sheets.GetByName("Formular") 
oForm = oSheet.DrawPage.Forms.GetByName("Standard")    
oComboBox = oform.getByName("oComboBoxBeschreibung")
beschr = oComboBox.text
oDocument=ThisComponent
  oSheet = ThisComponent.Sheets.getByName( "Materialaufwand" )              
  nEndCol = getLastUsedColumn(oSheet)        'see functions below
  nEndRow = getLastUsedRow(oSheet)
                                                                        
  REM Then do as you please, e.g.       
oCell=oSheet.getCellByPosition(nEndCol - 3 , nEndRow + 1) 
oCell.value = dat
oCell=oSheet.getCellByPosition(nEndCol - 2 , nEndRow + 1) 
oCell.Value = hab 
oCell=oSheet.getCellByPosition(nEndCol - 1 , nEndRow + 1) 
oCell.String = beschr
  ThisComponent.CurrentController.Select(oCell)
End Sub
Function getLastUsedColumn(oSheet as Object) as Integer
  Dim oCell As Object
  Dim oCursor As Object
  Dim aAddress As Variant
  oCell = oSheet.GetCellbyPosition( 0, 0 )
  oCursor = oSheet.createCursorByRange(oCell)
  oCursor.GotoEndOfUsedArea(True)
  aAddress = oCursor.RangeAddress
  GetLastUsedColumn = aAddress.EndColumn
End Function
In der Tabelle passiert folgendes: Wenn in der Spalte Wert die Formel hinterlegt ist (hier durch xy symbolisiert) überspringt er die Zeile, was ja eigentlich logisch ist da in dieser Reihe ja etwas vorhanden ist. Genau das soll aber nicht passieren, da die Formel ja mit den Daten aus dem Formular atbeiten soll. d.h. der Cursor soll auf die erste freie Zeile in der ersten Spalte springen und dann meine Daten eintragen.
Datum Anzahl Position Wert
16.3.06 10 33103
xy
16.3.06 10 33103

@ Stephan

Verfasst: So, 12.03.2006 09:49
von witchcorp
Hallo,
das trifft mein Problem schon besser, funktioniert auch. Das mit dem Formel per Makro eintragen habe ich auch versucht, aber wie sage ich dem Makro dass es die Formel in jeder Zeile auf die jeweilige Zeile anpassen soll (aus C2 muss dann C3 werden). Bin halt Logopädin und keine Programmiererin :oops: aber meine freie Mitarbeiterin wird sich jetzt über ein schönes OO-Formular freuen mit dem sie ihre Rechnungen schreiben kann :D .
Danke
Bianca

Verfasst: So, 12.03.2006 15:58
von Eckhardt
Hallo Bianca,
wenn Du mit relativer Adressierung arbeitest, werden die Zellbezüge normalerweise automatisch aktualisiert, d.h. Du darfst in der Zelladresse nicht das "$"-Zeichen verwenden.

Verfasst: So, 12.03.2006 16:12
von Eckhardt
Hallo Bianca,
der Vorschlag von eben funktioniert nur, wenn Du mit der Kopierfunktion arbeitest.
Trägst Du die Formel jedesmal per Makro ein, musst Du die Formel zusammensetzen und die jeweilige Zelladresse (entweder ganz oder nur die jeweilige Zeile) variabel halten.

Beispiel: sFormel = "Formeltext Spalte" & nEndRow+1 & "weiterer Formeltext".
oCell.Formula = sFormel 'Trägt die Formel in die Zelle ein.

Ich hoffe das Beispiel war deutlich genug, da ich Deine Formel nicht kenne. nEndRow + 1 ist dabei die im Makro ermittelte neue Zeilennr.