Seite 1 von 1
Calc: Befehl >Round< in Makros
Verfasst: So, 02.10.2011 12:31
von Shirkan
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
Re: Calc: Befehl >Round< in Makros
Verfasst: So, 02.10.2011 13:04
von komma4
Re: Befehl >Round< in Makros
Verfasst: So, 02.10.2011 13:09
von turtle47
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
Verfasst: So, 02.10.2011 13:16
von DPunch
Re: Calc: Befehl >Round< in Makros
Verfasst: So, 02.10.2011 13:27
von turtle47
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.
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
Verfasst: So, 02.10.2011 13:29
von Stephan
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
Verfasst: So, 02.10.2011 13:38
von DPunch
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
Verfasst: So, 02.10.2011 13:48
von Stephan
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
Verfasst: So, 02.10.2011 14:00
von DPunch
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
Verfasst: So, 02.10.2011 14:12
von Stephan
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
Verfasst: Mi, 05.10.2011 15:16
von howtoman
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.