Calc-Funktionen in Makros umwandeln?

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

locodriver
Beiträge: 5
Registriert: So, 28.11.2010 13:56

Calc-Funktionen in Makros umwandeln?

Beitrag von locodriver »

Hallo, bin neu hier und möchte meine Calc-Tabelle beschleunigen.
Ist es möglich, eine Zellberechnung mit mehreren Funktionen/Operationen, die in sehr viele Zellen eines Bereiches kopiert ist, als Makro zu programmieren und dann nur als neue Funktion im entsprechenden Zellbereich aufzurufen und auszuführen?
Das müsste doch die Größe des Arbeitsblattes reduzieren und die Berechnung beschleunigen, da die Funktion nur einmal und nicht viele Male programmiert und ausgeführt wird?
Ich möchte in folgender Tabelle (die über 100 Schichten beinhaltet und noch mehrere Blätter hat), in Spalte G (Nacht) die Formel als Makro ausführen lassen (in der Art: =FktNacht(B7;C7;$G$2;$G$3)).
In G2 und G3 stehen die Grenzen des Nachtarbeitszeitraumes als Konstanten und in B7 und C7 Beginn und Ende der Arbeitszeit.


G2-> von: 20:00
G3-> Bis: 06:00
Spalte A B C D E F G
Schichtnr. Dienstbeginn Dienstende Brutto Pause Netto Nacht

5001 03:35 11:59 08:24 00:30 07:54 02:25
5002 03:35 12:09 08:34 00:30 08:04 02:25
5003 14:30 00:31 10:01 00:45 09:16 04:31
5004 12:20 21:48 09:28 00:30 08:58 01:48
5005 05:10 14:29 09:19 00:30 08:49 00:50
5006 03:40 12:19 08:39 00:30 08:09 02:20
5007 14:00 23:58 09:58 00:45 09:13 03:58
5008 10:44 20:29 09:45 00:45 09:00 00:29
5009 03:33 12:19 08:46 00:30 08:16 02:27
5010 08:32 17:55 09:23 00:30 08:53 00:00

Die Formel in Spalte G lautet:

=MAX(0;MIN(G$3+(G$2>G$3);C7+(B7>C7))-MAX(G$2;B7))+MAX(0;(MIN(G$3;C7+(B7>C7))-B7)*(G$2>G$3))+MAX(0;MIN(G$3+(G$2>G$3);C7+0)-G$2)*(B7>C7)

Evtl. möchte ich auch noch in Spalte D und E die entsprechenden Formeln umwandeln:
Spalte D: =WENN(B7<C7;(C7-B7);(C7+1-B7))
Spalte E: =WENN(D7<=0,25;0;WENN(D7>=0,40625;0,03125;1/48))

Alle Zellen sind mit Uhrzeitformat HH:MM formatiert. Im Anhang ist noch mal die Bsp.-datei.

Vielen Dank!
Dateianhänge
Test.ods
(33.11 KiB) 47-mal heruntergeladen
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Calc-Funktionen in Makros umwandeln?

Beitrag von turtle47 »

Hallo,

hier noch ein Link zum OOo-Wiki Namen für Formeln.


Gruß

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc-Funktionen in Makros umwandeln?

Beitrag von Stephan »

Ist es möglich, eine Zellberechnung mit mehreren Funktionen/Operationen, die in sehr viele Zellen eines Bereiches kopiert ist, als Makro zu programmieren und dann nur als neue Funktion im entsprechenden Zellbereich aufzurufen und auszuführen?
Ein Makro ist nicht als Funktion aufzurufen. Eine Funktion wäre hingegen in Zellen aufzurufen darf aber, bezüglich der Zellen desselben Tabellenblattes, nur Rückgabewerte und keine Rückgabeaktionen liefern, alles was über die ERgebniswertanzeige der Funktion hinausgeht, geht somit für Zellen desselben blattes prinzipiell nicht.
Das müsste doch die Größe des Arbeitsblattes reduzieren und die Berechnung beschleunigen, da die Funktion nur einmal und nicht viele Male programmiert und ausgeführt wird?
Jein. Calc-Tabellenfunktionen sind im 'normalen' OOo-Code enthalten (als quasi C++-Kompillate) und laufen somit um ein mehrfaches schneller als Basic-Code benutzerdefinierter Tabellenfunktionen.
Ohne das ich jetzt genauer Werte nennen kann würde ich unterhalb einiger tausend Zellen deshalb keine Beschleunigung erwarten, sondern im Gegenteil eine Verlangsamung.

Der gerade gemachte Einwurf wäre natürlich hinfällig wenn Du einene benutzerdefinierte Funktionen als AddIN in C++ realisieren würdest, ich mutmaße jedoch das das nicht Deine Absicht ist bzw. Dein Können übersteigt. (mein Können übersteigt das in jedem Fall)



Gruß
Stephan
locodriver
Beiträge: 5
Registriert: So, 28.11.2010 13:56

Re: Calc-Funktionen in Makros umwandeln?

Beitrag von locodriver »

Danke für die schnellen Reaktionen.

@paljass: Das ist ja schon mal etwas um die Größe zu reduzieren, aber wie kann ich die ursprünglichen Formeln editieren, da in den Zellen nur noch die Aliasnamen (Pause, Nacht) stehen?

Die Formel speziell für die Nacht habe ich aus einem Excel-Forum, die ist glaube ich nicht weiter zu optimieren.


edit: habe den Dialog zum Formeländern "entdeckt"!

@stephan:
Ein Makro ist nicht als Funktion aufzurufen. Eine Funktion wäre hingegen in Zellen aufzurufen darf aber, bezüglich der Zellen desselben Tabellenblattes, nur Rückgabewerte und keine Rückgabeaktionen liefern, alles was über die ERgebniswertanzeige der Funktion hinausgeht, geht somit für Zellen desselben blattes prinzipiell nicht.

Also kann man keine neue Fkt. erstellen und als Makro ist der Effekt verschwindend? Ich habe mal gelesen (wo?), dass man mit Hilfe der engl. (org.) Fkt.-bezeichnungen doe Originalfkt. von OO in Makros einbauen kann.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc-Funktionen in Makros umwandeln?

Beitrag von Stephan »

Also kann man keine neue Fkt. erstellen


doch kann man, ich habe auch nichts Gegenteiliges geschrieben
und als Makro ist der Effekt verschwindend
Welcher Effekt?
Ich habe mal gelesen (wo?)
z.B. in der StarBasic-FAQ:
http://www.dannenhoefer.de/faqstarbasic ... l#Zweig229
dass man mit Hilfe der engl. (org.) Fkt.-bezeichnungen doe Originalfkt. von OO in Makros einbauen kann
Ja, das kann man, nur ich verstehe den Zusammenhang nicht. Jede Nutzung dieser Funktionen in Makros (genauer: in Basic-Makros) erfolgt per Basic-Code und dieser ist langsam, da nutzt es nichts wenn die Funktionen ansich schnell sind.

Ich hatte deutlich geschrieben das Funktionen (unter den Nebenbedingungen die hier gelten) nur Rückgabewerte liefern und keine Rückgabeaktionen und ich sehe dann keinen Weg wie eine solche Funktion schneller sein könnte als die Orginalfunktion, da selbst ein seeeehr kurzes Makro zumindest Wertzuweisungen an die, dann schnellen Funktionen, enthalten müßte, und das als langsamen Basic-Code.
Bestenfalls könnte ich mir als vorstellen das solche Funktionen nicht merklich langsamer sind, wohingegen sie von der Sache her immer langsamer sein müssen, weil sich ja die Gesamtzeit zusammensetzt aus der (im Makro ggf. referenzierten) schnellen Tabellenfunktion und dem notwendigen umgebenden Basic-Code.

Michael beschreibt unter besagtem Link z.B. die KGV-Funktion und man könte das als benutzerdefinierte Funktion schreiben als:

Code: Alles auswählen

Function mein_KGV(a,b,c)
oFunctionAccess = createUnoService( "com.sun.star.sheet.FunctionAccess" )
Dim args(2) As Variant

args(0) = a
args(1) = b
args(2) = c
End Fuction
und aufrufen in der Tabellenzelle mit:

=mein_KGV(A1;A2;A3)

und mir ist nicht klar wie das, auch nur theoretisch, schneller sein könnte als der direkte Aufruf mittels:

=KGV(A1;A2;A3)


Wie man hingegen diese Funktion intern als auf mehr als eine Zelle anwenden wolle UND das als einer Zelle aufrufen kann weiß ich nicht.

Als Makroaufruf, z.b. über eine Schaltfläche oder Tastenkombination ginge das natürlich, aber auch hier bleibt mir unklar warum das schneller sein könnte da inter der KGV_Aufruf auch im makro mehrfach erfolgen müßte.



Gruß
Stephan
locodriver
Beiträge: 5
Registriert: So, 28.11.2010 13:56

Re: Calc-Funktionen in Makros umwandeln?

Beitrag von locodriver »

@stephan:

Also setzt man Makros nur für Aufgaben ein, für die in Calc usw. keine Funktionen vorhanden sind. In den anderen Fällen ergibt sich eine Laufzeitverschlechterung obwohl die Tabelle (z.B. durch die Wiederholung immer der gleichen Formel) größer ist. Solange man nicht mit Speicherplatz geizen muss, ist es also nicht sinnvoll, mit Makros die Wiederholung von Funktionen zu vermeiden?
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc-Funktionen in Makros umwandeln?

Beitrag von Stephan »

Also setzt man Makros nur für Aufgaben ein, für die in Calc usw. keine Funktionen vorhanden sind.
Nein.
In den anderen Fällen ergibt sich eine Laufzeitverschlechterung


Allerdings heißt ja eine Laufzeitverlängerung nicht das man solche Funktionen nicht einsetzen würde, da ja Laufzeit allein nicht alles ist und im Übrigen ein sehr dehnbarer Begriff, denn es geht tendenziell bei Funktionen wie:

Code: Alles auswählen

Function mein_KGV(a,b,c)
oFunctionAccess = createUnoService( "com.sun.star.sheet.FunctionAccess" )
Dim args(2) As Variant

args(0) = a
args(1) = b
args(2) = c
End Fuction
sinngemäß vielleicht um vielleicht 1 ms oder weniger.

Beispielsweise braucht hier (auf einem bestimmten REchner) der Ablauf von:

Code: Alles auswählen

Dim args(2) As Variant

args(0) = a
args(1) = b
args(2) = c
die Zeit von ca. 0,02 ms.

Und andere Vorteile können das erheblich überwiegen, z.B. einfache, übersichtliche Formeln, welche aus benutzerdefinierten Funktionen resultieren können.
Solange man nicht mit Speicherplatz geizen muss, ist es also nicht sinnvoll, mit Makros die Wiederholung von Funktionen zu vermeiden?
WIE willst Du das denn überhaupt bewerkstelligen? Ich weiß es schlicht nicht, Ich schreibe nun zum dritten Male das auch in der selbst programmierten Funktion die interne Funktion mehrfach wiederholt werden muß und zwar so oft wie sie gebraucht wird und ich kann nicht sehen das das theoretisch schneller sein kann als der mehrfache Aufruf auf dem Tabellenblatt.
WEnn Du hingegen Beweise willst wirst Du es ausprobieren müssen.


Gruß
Stephan
Antworten