OOCalc 3.1 - Fragen zur Makroprogrammierung

16/07/2009 - 11:28 von Marc Haber | Report spam
Moin,

ich versuche gerade, mit OOo 3.1 unter Debian sid meine Zeiterfassung
ein wenig zu optimieren. Hierzu habe ich mir ein Makro "New Task"
geschrieben, das die folgenden Aktionen ausführt:

- Füge eine neue Zeile 5 ein.
- Kopiere die neue Zeile 6 in die neue Zeile 5
- Füge die aktuelle Zeit in Zelle A5 ein
- Füge die Formel "A5-A6" in Zelle B5 ein
- Setze den Cursor in Zelle E5

Hier ist mein Erstlingswerk:
1 Option Explicit

Sub Main
Dim Sheet as Object
5 Dim Cell as Object
Dim Ctrl as Object
Sheet = thisComponent.Sheets("")
Sheet.Rows.insertByIndex(4,1)
Cell=Sheet.getCellByPosition(0,4)
10 Cell.setValue(Now)
cell=Sheet.getCellByPosition(1,4)
Cell.setFormula("¥-A6")
cell=Sheet.getCellByPosition(2,4)
Cell.setFormula("=c6")
15 cell=Sheet.getCellByPosition(3,4)
Cell.setFormula("=d6")
cell=Sheet.getCellByPosition(4,4)
Cell.setFormula("=e6")
Ctrl=thisComponent.getCurrentController()
20 Ctrl.Select(Cell)

End Sub


Hierzu hab ich jetzt einige Fragen

(1)
Ich habe das Gefühl, dass ich verschiedene Zugriffsparadigmen
durcheinandergeworfen habe. Den Zugriff auf die Zellen ab Zeile 8 find
ich noch halbwegs intuitiv, aber das Geraffel mit getCurrentController
ab Zeile 19 zum Umsetzen des Cursors erscheint mir in dem Code wie ein
Fremdkörper. Geht das einfacher?

(2)
Kann ich direkt einen Range kopieren? Wie?

(3)
Wenn ich nicht einen Range direkt kopieren kann, würd ich das schon
gerne mit einer Schleife machen. Da fall ich aber über die
verschiedenen Adressierungsarten in getCellByPosition und setFormula.
Gibt es das irgendwie einheitlich, das ich nicht für eine
Zweikommandoschleife zwischen den beiden Adressierungsarten umrechnen
muss?

(4)
Ich würde gerne die Zeit nur minutengenau einfügen, sprich, beim
Einfügen der Zeit in Zeile 10 die Sekunden auf Null setzen. Wie geht
das?

(4)
Ich würde gerne nur dann eine neue Zeile einfügen, wenn die neue Zeit
eine andere Minute hat als die alte Zeit. Das scheitert bei mir zur
Zeit daran, dass sowohl das Ergebnis von "Now" als auch der aus der
Tabelle zurückgelesene Wert sekundengenau ist und ich somit nicht
einfach mit einem Vergleich der beiden Werte auskomme, und außerdem
ist der aus der Tabelle zurückgelesene Wert eine Zahl (z.B. 40010,46)
und der Rückgabewert von Now ist ein Datumsstring. Wie komme ich hier
weiter?

Danke für Eure Tipps.

Grüße
Marc

Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
 

Lesen sie die antworten

#1 Volker Lenhardt
16/07/2009 - 15:15 | Warnen spam
Hallo Marc,

Marc Haber schrieb:
(1)
aber das Geraffel mit getCurrentController
ab Zeile 19 zum Umsetzen des Cursors erscheint mir in dem Code wie ein
Fremdkörper. Geht das einfacher?



Das ist doch nur dafür da, den Cursor am Ende in eine Zelle zu setzen.

(2)
Kann ich direkt einen Range kopieren? Wie?



Siehe Makro.

(4)
Ich würde gerne die Zeit nur minutengenau einfügen, sprich, beim
Einfügen der Zeit in Zeile 10 die Sekunden auf Null setzen. Wie geht
das?
Ich würde gerne nur dann eine neue Zeile einfügen, wenn die neue Zeit
eine andere Minute hat als die alte Zeit. Das scheitert bei mir zur
Zeit daran, dass sowohl das Ergebnis von "Now" als auch der aus der
Tabelle zurückgelesene Wert sekundengenau ist und ich somit nicht
einfach mit einem Vergleich der beiden Werte auskomme, und außerdem
ist der aus der Tabelle zurückgelesene Wert eine Zahl (z.B. 40010,46)
und der Rückgabewert von Now ist ein Datumsstring. Wie komme ich hier
weiter?



Das Datum ist immer eine Zahl, niemals ein String. Die Ausgabe kann aber
entsprechend formatiert sein. Mit der Zellformatierung kommst Du zurecht?

Der ganzzahlige Anteil des Datums sind ganze Tage, der dezimale Anteil
die Uhrzeit als Dezimalbruch eines Tages. Umrechnung in Minuten siehe
unten.

Versuch es mal mit:

Sub Main
Dim Sheet as Object
Dim Cell as Object
Dim Ctrl as Object
Dim Source as New com.sun.star.table.CellRangeAddress
Dim Destination as New com.sun.star.table.CellAddress
Dim ActualDate as Date
dim i as integer

Sheet = thisComponent.Sheets("")
Sheet.Rows.insertByIndex(4,1)
Cell=Sheet.getCellByPosition(0,4)
ActualDate = now()
if int(Sheet.getCellByPosition(0,5).getValue() *24 * 60) _
<> int(ActualDate * 24 * 60) then Cell.setValue(Now)
With Source
.StartColumn=1: .StartRow=5: .EndColumn=4: .EndRow=5
End With
Destination.Column=1: Destination.Row=4
Sheet.copyRange(Destination, Source)
Ctrl=thisComponent.getCurrentController()
Ctrl.Select(Cell)
End Sub

Gruß
Volker

Ähnliche fragen