Makro automatisch starten

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

Moderator: Moderatoren

Hömmelmann
****
Beiträge: 119
Registriert: Di, 28.11.2006 19:44
Wohnort: Meppen

Makro automatisch starten

Beitrag von Hömmelmann »

Hallo,

eine kleine Frage hab ich da mal:

Ist es möglich, ein Makro automatisch beim Verlassen einer Zelle in einem Calc-Dokument zu starten?
Der Makro-Code soll also gestartet werden, wenn ich Return, die Cursor-Steuerung betätige oder in eine andere Zelle klicke.

Falls das möglich ist, wäre es weiterhin von Interesse, die "Koordinaten" der verlassenen Zelle verwenden zu können.


Danke für die Antwort.

Friedhelm
steffn
***
Beiträge: 92
Registriert: So, 16.11.2008 15:02

Re: Makro automatisch starten

Beitrag von steffn »

hallo,
das liest sich, wie das, was ich haben wollte
viewtopic.php?f=2&t=20882
ich bin mir sicher, du brauchst einen 'listener'

ich habe es verworfen, weil es mir zu kompliziert aussah :D
oo4.1.2 in winxp pro mit sp3
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro automatisch starten

Beitrag von Stephan »

Ist es möglich, ein Makro automatisch beim Verlassen einer Zelle in einem Calc-Dokument zu starten?
Ja, vorzugsweise über einen Listener.

Am Einfachsten ist es einen SelectionChange-Listener zu verwenden und diesen über ein Autostartmakro beim Öffnen der Datei automatisch zu registrieren und beim Schliessen der Datei ebenso zu entfernen.
Folgender Code erledigt das:

Code: Alles auswählen

Global oListener As Object 

Sub registrieren() 
oListener = CreateUnoListener( "xxx_", "com.sun.star.view.XSelectionChangeListener" ) 
ThisComponent.getCurrentController.addSelectionChangeListener(oListener)
End Sub

Sub entfernen()
On Error Resume Next
ThisComponent.CurrentController.removeSelectionChangeListener(oListener) 
End Sub 

Sub xxx_selectionChanged(ereignis) 
'hier der auszuführende Code
End Sub


Falls das möglich ist, wäre es weiterhin von Interesse, die "Koordinaten" der verlassenen Zelle verwenden zu können.
Diese Angabe steckt im Prinzip im automatisch übergebenen Parameter ereignis (siehe oben) beispielsweise:

Code: Alles auswählen

ereignis.source.selection.AbsoluteName
allerdings ist das jeweils die Zelle nach verlassen der ursprünglichen Zelle, so das man die ursprüngliche Zelle jeweils temporär speichern müßte und dann zurückgeben und durch die Werte der nächsten Zelle ersetzen, also ungefähr so:

Code: Alles auswählen

Global tmp_sel 
Global oListener As Object 

Sub xxx_selectionChanged(ereignis)
'hier der auszuführende Code unter Verwendung der Info des im vorherigen Durchlaufs gespeicherten 'Koordinatenwerts' tmp_sel
 
tmp_sel = ereignis.source.selection.AbsoluteName
End Sub
Diese einfache Art der Auswertung funktioniert aber nur wenn Du die Zelle nicht mittels Maus wechselst, falls Du mit Maus arbeiten mußt wäre zusätzlicher Code nötig.
(Im Prinzip weil ein Fehler vorliegt der bewirkt das beim mouse-move auch eine Änderung der Selektion erfolgt trotzdem keine Mausetaste gedrückt ist, das müßte abgefangen werden. Ich kann auf die Schnelle nicht sagen wie man das am Zweckmäßigsten machen sollte, da es sicher mehrere Wege gäbe.)


Gruß
Stephan
Antworten