ich benutze die Calc-Version 6.0.7.3 (Build-ID: 1:6.0.7-0ubuntu0.18.04.10) unter Linux.
Ich arbeite gerade an einer Kalkulation zum Zwecke der Haushaltsplanung. Ein Dokument erfasst alle Kostenpunkte, verteilt auf mehrere Tabellen. Ein anderes Dokument greift das Budget, also die in den Tabellen erfassten Kostenpunkte, wieder auf und enthält Tabellen für jeden Monat des Jahres. Dort werden beispielsweise Abweichungen vom Budget erfasst. Der Folgemonat greift dann das Ergebnis des alten Monats wieder auf. So besteht immer ein Überblick darüber, wie viel Geld für was aktuell vorhanden ist.
Da manchmal Kostenpunkte wegfallen und leere Zeilen unschön sind, müssen die Tabellen, die die Kostenpunkte erfassen, sortiert werden. Dabei verschiebt sich die Position eines Kostenpunkts. Damit in dem 2. Dokument der Folgemonat dann noch den richtigen Wert zum richtigen Kostenpunkt in der Tabellen des alten Monats findet, müsste man per Formel nach dem Namen des Kostenpunkts suchen und dann in dessen Zeile die richtige Zahl holen. Dadurch wäre aber der Name des Kostenpunkts nicht problemlos umbenennbar.
Um den Namen also auch umbenennen zu können, hätte ich gerne einen einzigartigen ID-Code zu jedem Kostenpunkt, anhand dem er immer identifizierbar bleibt. Er soll automatisch erstellt werden mit der Formel "=JETZT()&"a"&ZUFALLSBEREICH(1;99999)". Allerdings ändert sich ja dieser Wert. Und damit er es nicht macht, wird die Formel anschließend in einen Wert umbenannt.
Wie die Tabelle aussieht, zeigt das Bild im Anhang.
Ich habe mich in der Makroprogrammierung versucht und bin an einer Stelle hängengeblieben. Das Makro entfernt alte Kostenpunkte aus den vorher angewählten Zeilen. Anschließend wird automatisch sortiert. Und eben danach fehlt der Code, der in den leeren Zeilen unterhalb der Kostenpunkte (leere Zeilen sind die, wo gelöscht wurden) meine Formel "=JETZT()&"a"&ZUFALLSBEREICH(1;99999)" einfügt. Alle leere Zeilen stehen nach dem Sortieren untereinander.
Ich habe das Problem versucht manuell zu lösen: Ich habe den Dialog Suchen & Ersetzen geöffnet. Nichts als Suchwort eingetragen, aber meine Formel als Ersetzungswort. In dem angewählten Bereich steht in den leeren Zellen nachher meine Formel, aber die Formel wird nicht als solche erkannt, trotz des Gleichheitszeichens davor. Sie wird wie Text behandelt.
Mein Makro:
Code: Alles auswählen
sub Kostenpunktentferner
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 ----Jetzt werden aus allen angewaehlten Zeilen alles außer Formeln und Formate entfernt-----
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "SVDN"
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args1())
rem ------Jetzt wird der Sortierbereich angewaehlt---------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$3:$AZ$31"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
rem -----------Jetzt wird sortiert-------------
dim args3(8) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ByRows"
args3(0).Value = true
args3(1).Name = "HasHeader"
args3(1).Value = false
args3(2).Name = "CaseSensitive"
args3(2).Value = false
args3(3).Name = "NaturalSort"
args3(3).Value = false
args3(4).Name = "IncludeAttribs"
args3(4).Value = true
args3(5).Name = "UserDefIndex"
args3(5).Value = 0
args3(6).Name = "Col1"
args3(6).Value = 1
args3(7).Name = "Ascending1"
args3(7).Value = true
args3(8).Name = "IncludeComments"
args3(8).Value = false
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args3())
rem --Hier muesste zuerst Code eingefuegt werden, der im Bereich B3:B31 LEERE Zellen mit der Formel "=JETZT()&"a"&ZUFALLSBEREICH(1;99999)" befuellt.--
rem --Jetzt wird der Bereich angewaehlt, wo Formeln in Werte verwandelt werden sollen--
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "ToPoint"
args4(0).Value = "$B$3:$B$31"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())
rem ----------Jetzt wird in Werte konvertiert---------
dispatcher.executeDispatch(document, ".uno:ConvertFormulaToValue", "", 0, Array())
rem ----------------Wir kehren zur ersten Zelle in der Tabelle zurueck----------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())
end sub