Calc: Befehl >Round< in Makros

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: Befehl >Round< in Makros

Re: Calc: Befehl >Round< in Makros

von howtoman » Mi, 05.10.2011 15:16

DPunch hat geschrieben:

Code: Alles auswählen

Function Round(ByVal nNumber as Double, nCount as Integer)
	nNumber = CInt(nNumber * 10^nCount)
	Round = nNumber * 10^-nCount
End Function
das geht bei großen Zahlen nicht.. leider.
globale acces round geht glaube ich schon, ist aber ziemlich langsam, und wie vorher gesagt, nicht so sicher.
genau so könnte man FORMAT benutzen (format(zahl, #.###) ) ist aber auch langsam und man muss auch gut die ROUND Funktion damit zuerst schreiben.

Also mit Format könnte man ziemlich unabhängige ROUND Funktion schreiben, die auch 1000 stellige zahlen runden kann.

Re: Calc: Befehl >Round< in Makros

von Stephan » So, 02.10.2011 14:12

ja, verstehe (und erlaube mir trotzdem Deine Lösung für die etwas Bessere zu halten)

Weil es ja hier nur um 2 Zeilen Code ginge die 'mitgeschleppt werden müßten und dafür erheblich an 'Langzeitsicherheit' gewonnen wäre, wie du es selbst andeutest:
wahrscheinlicher, dass eine solche Funktion in 10 Jahren noch gaargenau dasselbe tut, ob der FunctionAccess andererseits in 10 Jahren auch immer noch genauso aufgerufen wird, steht da eher in den Sternen.

In Praxis ist das auch eine Kostenfrage, denn ein paar Zeilen Code zu kopieren kostet wenig, irgendwann hunderte Makros ändern zu müssen, bei häufig nicht sauberer modularer Implementierung, kostet sehr viel.

Ich persönlich verwende aus leidlicher Erfahrung z.B. nie irgendwelche Rückgriffe auf Funktionen in den OOo-Bibliotheken, sondern schreibe das nötigenfalls nochmals als Kopie in die Makros.

Re: Calc: Befehl >Round< in Makros

von DPunch » So, 02.10.2011 14:00

Stephan hat geschrieben:dass müßtest Du erklären.
Für den normalen Anwender in dem Sinne 'globaler', dass ein Makro immer darauf zugreifen kann, wohingegen eine eigene Funktion stets mitgeschleppt werden müsste, entweder in allen relevanten Dokumenten oder eben in Form einer Extension.

Natürlich gibt es da Ausnahmen und ich denke es ist auch wahrscheinlicher, dass eine solche Funktion in 10 Jahren noch gaargenau dasselbe tut, ob der FunctionAccess andererseits in 10 Jahren auch immer noch genauso aufgerufen wird, steht da eher in den Sternen.

Globaler also absolut nicht im Sinne von robuster, sondern was die Verfügbarkeit für normale Anwender betrifft.

Re: Calc: Befehl >Round< in Makros

von Stephan » So, 02.10.2011 13:48

wobei der FunctionAccess sicherlich die "globalere" Variante ist
dass müßtest Du erklären.

Nach meiner Erfahrung ist ein direkter ZUgriff über Basic, wie Du ihn hier vorschlägst, universeller.
Praxisbeispiel aus meiner jüngsten beruflichen Tätigkeit ist dabei ein 'OOo-Großkunde' der sein Office selbst angepasst kompiliert und dabei TEile der API 'abschaltet', was zwar im Kónkreten nicht das Beispiel betrifft über das wir hier reden was aber eigentlich andeutet das Programmierungen die sich nur auf den Sprachinhalt von Basic beschränken 'globaler' (robuster/universeller) sind.


Gruß
Stephan

Re: Calc: Befehl >Round< in Makros

von DPunch » So, 02.10.2011 13:38

Aloha

Asche auf mein Haupt, ich war tatsächlich nur vom Runden auf Ganzzahlen ausgegangen.

Prinzipiell kann man die Typkonvertierung natürlich trotzdem wunderbar dafür nutzen, wobei der FunctionAccess sicherlich die "globalere" Variante ist.

Code: Alles auswählen

Function Round(ByVal nNumber as Double, nCount as Integer)
	nNumber = CInt(nNumber * 10^nCount)
	Round = nNumber * 10^-nCount
End Function

Re: Calc: Befehl >Round< in Makros

von Stephan » So, 02.10.2011 13:29

Viel einfacher:
eigentlich nicht, denn DEin Codevorschlag rundet nur auf Ganzzahlen, was nicht identisch ist mit der Funktionalität der Funktion ROUND (Tabellenfunktion) die hier wohl eher gefragt war.


Gruß
Stephan

Re: Calc: Befehl >Round< in Makros

von turtle47 » So, 02.10.2011 13:27

Hallo DPunch
DPunch hat geschrieben:Viel einfacher:

Code: Alles auswählen
i = 12.35
MsgBox CInt(i)
Schöne Lösung. Aber, es war nicht die Frage gestellt wie man einen Zahl runden kann, sondern wie man mit der Funktion "Round" eine Zahl rundet. :wink:
Shirkan hat geschrieben:dass in der Makrosprache Basic der Befehl >Round< nicht zur Verfügung steht?
Ausserdem kann man mit Deiner Lösung nicht beeinflussen zu welcher Stelle gerundet wird. :? Oder?

Jürgen

Re: Calc: Befehl >Round< in Makros

von DPunch » So, 02.10.2011 13:16

Aloha

Viel einfacher:

Code: Alles auswählen

i = 12.35
MsgBox CInt(i)

Re: Befehl >Round< in Makros

von turtle47 » So, 02.10.2011 13:09

Hallo Markus,
Shirkan hat geschrieben:sehe ich das richtig, dass in der Makrosprache Basic der Befehl >Round< nicht zur Verfügung steht?
Wie kommst Du darauf?

Guckst Du auch mal: Wie kann man Funktionen von Calc verwenden?

Man kann das aber auch so schreiben:

Code: Alles auswählen

oFunctionAccess = createUnoService( "com.sun.star.sheet.FunctionAccess")
iNumber = 12.46
iCount = 1
result = oFunctionAccess.callFunction( "ROUND", array(iNumber, iCount)) 
print result
Gruß
Jürgen

Re: Calc: Befehl >Round< in Makros

von komma4 » So, 02.10.2011 13:04

Calc: Befehl >Round< in Makros

von Shirkan » So, 02.10.2011 12:31

Liebe Leute,
sehe ich das richtig, dass in der Makrosprache Basic der Befehl >Round< nicht zur Verfügung steht? Wenn ja möchte ich fragen, ob jemand eine entsprechende Prozedur schon mal geschrieben hat und gegebenenfalls bereit wäre diese zur Verfügung zu stellen.
Schon mal Danke
Gruß Markus



Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst

Nach oben