Calc-Funktionen in Makros umwandeln?

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Calc-Funktionen in Makros umwandeln?

Re: Calc-Funktionen in Makros umwandeln?

von Stephan » So, 28.11.2010 16:57

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

Re: Calc-Funktionen in Makros umwandeln?

von locodriver » So, 28.11.2010 16:39

@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?

Re: Calc-Funktionen in Makros umwandeln?

von Stephan » So, 28.11.2010 16:24

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

Re: Calc-Funktionen in Makros umwandeln?

von locodriver » So, 28.11.2010 15:37

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.

Re: Calc-Funktionen in Makros umwandeln?

von Stephan » So, 28.11.2010 15:17

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

Re: Calc-Funktionen in Makros umwandeln?

von turtle47 » So, 28.11.2010 15:14

Hallo,

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


Gruß

Jürgen

Calc-Funktionen in Makros umwandeln?

von locodriver » So, 28.11.2010 14:40

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

Nach oben