von Stephan » Mo, 16.08.2004 12:24
Hallo Charly,
leider wird nicht klar was Du erreichen willst, da STRG+Pfeiltaste etwas Anderes tut als Du verbal beschreibst. (STRG+Pfeiltaste geht NICHT zur nächsten Zelle mit Inhalt, sondern zur ersten Zelle die die Grenze (vordere oder hintere) eines Blockes darstellt der entweder nur leere oder nur Zellen mit Inhalt umfaßt, abhängig von der Ausgangszelle).
Für STRG+Pfeiltaste (im Sinne dessen was diese Kombination bei manueller Eingabe tut), sehe ich nur die Möglichkeit eines UNO-Kontrukts, so Du das nicht selber alles prüfen willst. Folgendes kannst Du aufzeichnen:
Code: Alles auswählen
sub aufzeichnung 'STRG + ->
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 1
args1(1).Name = "Sel"
args1(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoRightToEndOfData", "", 0, args1())
end sub
Willst Du jedoch erreichen, was Du verbal beschreibst (gehe zur nächsten Zelle die nicht leer ist), dann verwende z.B. das:
Code: Alles auswählen
Sub rechts 'bis zur nächsten Zelle die nicht leer ist
oSelect = ThisComponent.CurrentSelection
oCell = oselect.getCellAddress()
oRow = oCell.Row
oColumn = oCell.column
a = 1
Do
'Blattindex = 0 (anpassen)
new_cell = ThisComponent.Sheets(0).getCellByPosition(oColumn+a,oRow)
a = a + 1
loop while new_cell.type = com.sun.star.table.CellContentType.EMPTY
add = GetAddress (new_cell.GetCellAddress().Column, new_cell.GetCellAddress().Row)
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = add
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
End Sub
Function GetAddress (x, y As INTEGER)
Dim nb,i As Integer
Dim AdrStr As String
AdrStr = ""
nb= (x+1) / 26
if ( nb >= 1 ) then
AdrStr = Chr(64 + Fix(nb))
end if
AdrStr = AdrStr+Chr((x mod 26)+65)
AdrStr = AdrStr+Cstr(y+1)
GetAddress = AdrStr
End Function
Du wunderst Dich möglicherweise warum ich das Selektieren der Zelle mittels .uno... durchführe, das hat seinen Grund darin das Du wohl die Zelle so selektieren willst, das sie optisch einenb Rahmen um die Zelle darstellt und Folgendes dafür nicht exakt funktionieren würde (z.B.):
Code: Alles auswählen
sub eine
odoc=thiscomponent
oCtl=oDoc.getCurrentController
oSheet = oCtl.ActiveSheet
oCell = oSheet.getCellRangeByName("F17")
oCtl.select(oCell)
end sub
Damit die sich ergebene Selektion optisch gut aussieht müßtest Du anschließend ein anderes Blatt aktivieren und dann wieder das ursprüngliche. Kein Problem wenn Du ein zweites Blatt hast, aber wenn nicht müßtest Du es erst anlegen und dann wieder löschen...
Gruß
Stephan
Hallo Charly,
leider wird nicht klar was Du erreichen willst, da STRG+Pfeiltaste etwas Anderes tut als Du verbal beschreibst. (STRG+Pfeiltaste geht NICHT zur nächsten Zelle mit Inhalt, sondern zur ersten Zelle die die Grenze (vordere oder hintere) eines Blockes darstellt der entweder nur leere oder nur Zellen mit Inhalt umfaßt, abhängig von der Ausgangszelle).
Für STRG+Pfeiltaste (im Sinne dessen was diese Kombination bei manueller Eingabe tut), sehe ich nur die Möglichkeit eines UNO-Kontrukts, so Du das nicht selber alles prüfen willst. Folgendes kannst Du aufzeichnen:
[code]sub aufzeichnung 'STRG + ->
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 1
args1(1).Name = "Sel"
args1(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoRightToEndOfData", "", 0, args1())
end sub[/code]
Willst Du jedoch erreichen, was Du verbal beschreibst (gehe zur nächsten Zelle die nicht leer ist), dann verwende z.B. das:
[code]Sub rechts 'bis zur nächsten Zelle die nicht leer ist
oSelect = ThisComponent.CurrentSelection
oCell = oselect.getCellAddress()
oRow = oCell.Row
oColumn = oCell.column
a = 1
Do
'Blattindex = 0 (anpassen)
new_cell = ThisComponent.Sheets(0).getCellByPosition(oColumn+a,oRow)
a = a + 1
loop while new_cell.type = com.sun.star.table.CellContentType.EMPTY
add = GetAddress (new_cell.GetCellAddress().Column, new_cell.GetCellAddress().Row)
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = add
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
End Sub
Function GetAddress (x, y As INTEGER)
Dim nb,i As Integer
Dim AdrStr As String
AdrStr = ""
nb= (x+1) / 26
if ( nb >= 1 ) then
AdrStr = Chr(64 + Fix(nb))
end if
AdrStr = AdrStr+Chr((x mod 26)+65)
AdrStr = AdrStr+Cstr(y+1)
GetAddress = AdrStr
End Function[/code]
Du wunderst Dich möglicherweise warum ich das Selektieren der Zelle mittels .uno... durchführe, das hat seinen Grund darin das Du wohl die Zelle so selektieren willst, das sie optisch einenb Rahmen um die Zelle darstellt und Folgendes dafür nicht exakt funktionieren würde (z.B.):
[code]sub eine
odoc=thiscomponent
oCtl=oDoc.getCurrentController
oSheet = oCtl.ActiveSheet
oCell = oSheet.getCellRangeByName("F17")
oCtl.select(oCell)
end sub[/code]
Damit die sich ergebene Selektion optisch gut aussieht müßtest Du anschließend ein anderes Blatt aktivieren und dann wieder das ursprüngliche. Kein Problem wenn Du ein zweites Blatt hast, aber wenn nicht müßtest Du es erst anlegen und dann wieder löschen...
Gruß
Stephan