Calc: Befehl >Round< in Makros

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Shirkan
***
Beiträge: 62
Registriert: Di, 21.06.2011 10:34

Calc: Befehl >Round< in Makros

Beitrag 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
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc: Befehl >Round< in Makros

Beitrag von komma4 »

Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Befehl >Round< in Makros

Beitrag 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
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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Calc: Befehl >Round< in Makros

Beitrag von DPunch »

Aloha

Viel einfacher:

Code: Alles auswählen

i = 12.35
MsgBox CInt(i)
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Calc: Befehl >Round< in Makros

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

Beitrag 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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Calc: Befehl >Round< in Makros

Beitrag 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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Befehl >Round< in Makros

Beitrag 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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Calc: Befehl >Round< in Makros

Beitrag 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.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Befehl >Round< in Makros

Beitrag 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.
howtoman
*
Beiträge: 19
Registriert: So, 29.05.2011 13:06

Re: Calc: Befehl >Round< in Makros

Beitrag 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.
Antworten