Cursor mit Strg+Pfeiltasten mit Makro bewegen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Cursor mit Strg+Pfeiltasten mit Makro bewegen

Beitrag von Charly »

Hallo!

Wenn ich in einem Calc-Dokument Strg und die Pfeiltasten zusammen verwende, wird die Zelle vor der nächsten Leerzelle ausgewählt. Bei nochmaliger Betätigung erreiche ich die nächste gefüllte Zelle usw. bis zum Ende des Tabellenblattes.

Wie kann ich dasselbe in einem Makro mit dem Cursorobjekt

Code: Alles auswählen

Cursor =Blatt.createCursor()
erreichen

Ich habe nur die Befehlsfolgen

Code: Alles auswählen

SbxVOID gotoStartOfUsedArea ( SbxBOOL )
SbxVOID gotoEndOfUsedArea ( SbxBOOL )
SbxVOID gotoStart ( void )
SbxVOID gotoEnd ( void )
SbxVOID gotoNext ( void )
SbxVOID gotoPrevious ( void )
SbxVOID gotoOffset ( SbxLONG, SbxLONG ) 
gefunden.

Aber das passt nicht ganz für meine Zwecke.

Gruß
Charly
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von 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: 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
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly »

Hallo Stephan!

Vielen Dank.
Ich weiß ich habe mich etwas unklar ausgedrückt. Eigentlich hätte ich fragen sollen, wie kann ich die Leerzeichen am schnellsten überspringen. Dafür habe ich auch bisher auch das Programm vom Makrorekorder verwendet.
Ich hatte nur gehofft, es gibt noch einen einfacheren Befehl wie z.B. gotoEndofUsedArea usw.
Ansonsten komme ich mit dem aufgezeichneten Programm klar. Dein Alternativprogramm ist allerdings auch interssant. Ich muss mir noch überlegen, wie ich das verwenden kann.

Gruß
Charly
Antworten