Calc-Funktionen in Makros umwandeln?
Moderator: Moderatoren
-
- Beiträge: 5
- Registriert: So, 28.11.2010 13:56
Calc-Funktionen in Makros umwandeln?
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!
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) 46-mal heruntergeladen
Re: Calc-Funktionen in Makros umwandeln?
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
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Re: Calc-Funktionen in Makros umwandeln?
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.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?
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.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?
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
-
- Beiträge: 5
- Registriert: So, 28.11.2010 13:56
Re: Calc-Funktionen in Makros umwandeln?
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:
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.
@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?
Also kann man keine neue Fkt. erstellen
doch kann man, ich habe auch nichts Gegenteiliges geschrieben
Welcher Effekt?und als Makro ist der Effekt verschwindend
z.B. in der StarBasic-FAQ:Ich habe mal gelesen (wo?)
http://www.dannenhoefer.de/faqstarbasic ... l#Zweig229
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.dass man mit Hilfe der engl. (org.) Fkt.-bezeichnungen doe Originalfkt. von OO in Makros einbauen kann
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
=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
-
- Beiträge: 5
- Registriert: So, 28.11.2010 13:56
Re: Calc-Funktionen in Makros umwandeln?
@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?
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?
Nein.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
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
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
Und andere Vorteile können das erheblich überwiegen, z.B. einfache, übersichtliche Formeln, welche aus benutzerdefinierten Funktionen resultieren können.
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.Solange man nicht mit Speicherplatz geizen muss, ist es also nicht sinnvoll, mit Makros die Wiederholung von Funktionen zu vermeiden?
WEnn Du hingegen Beweise willst wirst Du es ausprobieren müssen.
Gruß
Stephan