Seite 1 von 2
Writer: Auf 2 Nachkommastellen runden
Verfasst: Fr, 02.06.2017 21:35
von Björn89
Hi,
ich erstelle im Moment Makros für den OO WRITER (!!!), nicht Calc.
Ich hänge jetzt schon ein paar Stunden an dem Problem, dass ich es nicht schaffe Zahlen mit genau 2 Nachkommastellen zu erzeugen.
Die brauche ich eben um einen Geldbetrag anzuzeigen, der in meinem Makro berechnet wird in Verbindung mit einer Benutzereingabe.
Wenn ich schreibe:
Kommt immer ein Laufzeitfehler (Objektvariable nicht belegt).
Habe die Variable auch mitlerweile mal als Datentyp Currency definiert, aber der Datentyp zeigt leider 4 Nachkommastellen an.
Finde im Internet leider keine Lösung, die funktioniert, wäre sehr nett wenn mir hier jemand helfen könnte.
Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst; CODE tags gesetzt
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Fr, 02.06.2017 22:36
von komma4
Willkommen im Forum!
Du wirst schon erstmal selbst etwas debuggen müssen, was hier falsch ist: Dein Fehler sollte schon nachvollziehbar sein (-> lauffähiges Beispiel posten!).
Ich gehe davon aus, dass geldbetrag nicht besetzt ist
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Fr, 02.06.2017 22:42
von balu
Hallo Björn89,
Kommt immer ein Laufzeitfehler (Objektvariable nicht belegt).
Ich als Office würde das gleiche sagen, das die Objektvariable nicht belegt ist. Denn mit dieser einen Codezeile kann kein Mensch etwas anfangen. Also am besten hängst Du eine Beispieldatei (KEIN SCREENSHOT) hier an. Erst dann können wir weitersehen.
Gruß
balu
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Sa, 03.06.2017 09:53
von Björn89
Dieser Code funktioniert, nur zeigt er eben 4 Nackommastellen an.
Code: Alles auswählen
sub Rechnung
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem Variableneingabe
Dim teilnahmen as Integer
teilnahmen = InputBox("Wie viele Personen haben teilgenommen?")
rem Preisberechnungen
Dim nettopreis as currency
nettopreis = teilnahmen * 4.90
Dim bruttopreis as currency
bruttopreis = nettopreis * 1.19
Dim mwsteuer as currency
mwsteuer = bruttopreis - nettopreis
'[...hier folgt nur formatierter Text...]
dim args15(0) as new com.sun.star.beans.PropertyValue
args15(0).Name = "Text"
args15(0).Value = "-" + teilnahmen + " Teilnahmen am Programm" + CHR(10)
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args15())
dim args16(0) as new com.sun.star.beans.PropertyValue
args16(0).Name = "Text"
args16(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + teilnahmen + " x " + "4,90 = € " + nettopreis + CHR(10)
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args16())
dim args17(0) as new com.sun.star.beans.PropertyValue
args17(0).Name = "Text"
args17(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + CHR$(9) + "netto €" + nettopreis + CHR(10)
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args17())
dim args18(0) as new com.sun.star.beans.PropertyValue
args18(0).Name = "Text"
args18(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + CHR$(9) + "zuzügl. 19% MwSt. € " + mwsteuer + CHR(10)
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args18())
dim args19(0) as new com.sun.star.beans.PropertyValue
args19(0).Name = "Text"
args19(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + CHR$(9) + CHR$(9) + "€ " + bruttopreis + CHR(10)
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args19())
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Sa, 03.06.2017 10:03
von Björn89
In diesem Code versuche ich die Rundung mit Math.Round:
Code: Alles auswählen
sub Rechnung
rem define variables
dim document as object
dim dispatcher as object
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Dim teilnahmen as Integer
teilnahmen = InputBox("Wie viele Personen haben teilgenommen?")
Dim nettopreis as currency
nettopreis = teilnahmen * 4.90
nettopreis = Math.Round(nettopreis, 2)
dim args16(0) as new com.sun.star.beans.PropertyValue
args16(0).Name = "Text"
args16(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + teilnahmen + " x " + "4,90 = € " + nettopreis + CHR(10)
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args16())
Fehlermeldung: Objektvariable nicht belegt. (und markiert die Zeile: nettopreis = Math.Round(nettopreis, 2)
nettopreis ist aber ja direkt drüber deklariert und bekommt einen Wert zugewiesen.
Muss man vielleicht erst ein Paket importieren, damit Math.Round funktioniert?
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Sa, 03.06.2017 12:25
von Stephan
Fehlermeldung: Objektvariable nicht belegt. (und markiert die Zeile: nettopreis = Math.Round(nettopreis, 2)
nettopreis ist aber ja direkt drüber deklariert und bekommt einen Wert zugewiesen.
naja, gemeint mit Objektvariable ist hier "Math", "Nettopreis" ist doch überhaupt nicht als Objektvariable deklariert sondern als Currency
Muss man vielleicht erst ein Paket importieren, damit Math.Round funktioniert?
Wenn dann müsste dieses Paket das API von OO erweitern, was Du doch sicherlich nicht beabsichtigst.
Mir ist deshalb nicht ganz klar woher Du diesen Code hast - OpenOffice ist KEIN MS Office und auch KEIN Windows Scripting Host (nur um einmal zwei Mutmaßungen zur Code-Herkunft anzusprechen).
Viel einfacher wäre es doch das Runden in einer Function zu kapseln, meinethalben:
Code: Alles auswählen
Function runden(zahl, stellen)
oFunctionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")
Dim args(1) As Variant
args(0) = zahl
args(1) = stellen
runden = oFunctionAccess.callFunction( "Round", args() )
End Function
und dann normal aufzurufen mittels:
Gruß
Stephan
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Sa, 03.06.2017 13:21
von Björn89
Hallo Stephan. Danke erstmal für deine Antwort.
Also ich programmiere den Code in den Makros von Open Office Writer (Basic).
Daher gehe ich mal davon aus, dass die Programmiersprache Visual Basic ist.
Den Code "Math.Round" habe ich ergoogelt.
Ich habe mal deinen Code ausprobiert, innerhalb des Programms (also zwischen Sub und End Sub) meckert er, dass eine Funktion nicht innerhalb einer Prozedur sein darf.
Wenn ich die Funktion vor das Sub setze, dann kommt der Fehler: "Objektvariable nicht belegt" (und markiert das "runden" in der vorletzten Zeile).
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Sa, 03.06.2017 15:22
von Toxitom
Hey Björn,
Also ich programmiere den Code in den Makros von Open Office Writer (Basic).
Daher gehe ich mal davon aus, dass die Programmiersprache Visual Basic ist.
Lustig:) Wie kommst Du darauf? OOo hat eine eigene Basic-Sprache, wobei natürlich das Grundgerüst zu Basic stimmt.
Eine "round" Funktion gibt es nicht im eingebauten Befehlssatz. Bleibt auch dei Frage, wozu Du die brauchst. Nur für die Darstellung? in dem Fall würde man eine interne Zahl entsprechend formatieren... also so etwas wie sZahl = Format(iZahl, "#.##0,00 €").
Möchtest Du intern rechnen, wäre die Variable als Currency korrekt deklariert (5 Nachkommastellen). Das ist üblich in der Finanzbranche.
Willst Du immer nur mit zwei Stellen rechnen, so kannst Du einen "Trick" anwenden: alle Werte mit 100 multiplizieren und dann ausschliesslich Integer oder Long-Variablen nutzen. Erst vor der Ausgabe wieder durch 100 dividieren.
Aber ehrlich gesagt: Dein gepostetet Code benutzt überwiegend Dispatcher Code - also wahrscheinlich mit Makro-Rekorder aufgenommen. Das wird nix "echtes";)
Da wirst Du wohl ein wenig tiefer einsteigen müssen - in das UNO-Modell und seine Möglichkeiten:)
Viele Grüße
Tom
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Sa, 03.06.2017 17:10
von Stephan
Wenn ich die Funktion vor das Sub setze, dann kommt der Fehler: "Objektvariable nicht belegt" (und markiert das "runden" in der vorletzten Zeile).
in der Funktion muß (zumindest) der Parameter "zahl" explizit deklariert sein, also z.B.:
Code: Alles auswählen
Function runden(zahl As Double, stellen)
oFunctionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")
Dim args(1) As Variant
args(0) = zahl
args(1) = stellen
runden = oFunctionAccess.callFunction( "Round", args() )
End Function
Allerdings ist Das Runden ohnehin etwas sinnfrei, wenn man sich das Makro genau anschaut, denn wegen der Deklaration von "nettopreis" als currency, ist das Runden auf 2 Stellen wirkungslos denn es werden immer 4 Nachkommastellen beibehalten.
Zusätzlich liefert die Multiplikation einer Ganzzahl mit 4,90 immer ein Ergebnis mit nur einer Nachkommastelle, daraus werden auch durch Runden keine 2 Nachkommastellen, denn Nullen werden dort nicht ausgegeben. Wenn es also um die Anzeige geht gilt hier das von Thomas Gesagte.
Gruß
Stephan
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: So, 04.06.2017 09:21
von Björn89
Das funktioniert leider alles nicht richtig.
Mit einer Tabelle würde es wahrscheinlich funktionieren, da gibt es Zahlenformat: Währung.
Sieht aber optisch nicht gut aus.
Oder ich benutze Calc, aber da ist das Problem wahrscheinlich das selbe, das ist ja eine Rechnung.
Muss mal schauen ob ich das so formatiert kriege, dass das gut aussieht.
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: So, 04.06.2017 10:10
von komma4
Björn89 hat geschrieben: ↑So, 04.06.2017 09:21Calc ... eine Rechnung ...formatiert
Du weisst schon, dass in CALC berechnet werden kann und die Werte dann nach WRITER (dynamisch) kopiert werden können (Stichwort:
DDE; oder auch
CALC als Datenquelle eines Serienbriefs=Rechnung).
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: So, 04.06.2017 10:26
von Stephan
Das funktioniert leider alles nicht richtig.
Was genau funktioniert denn nicht?
Ich hatte auf die (möglichen
(*)) Fehler im Code hingewiesen und auch auf die Überflüssigkeit des Rundens im Konkreten,mithin reicht es doch die Deklarierung als Currency und das Runden wegzulassen sowie die fehlende Null zu ergänzen.
(*)
"möglichen", weil es natürlich keine wirklichen Fehler sind, sondern eher unzweckmäßige Dinge wenn ich richtig liege mit meiner Vermutung was erreicht werden soll (z.B. ist die Deklarierung als Currency kein Fehler aber wahrscheinlich unerwünscht, weil dadurch immer 4 Nachkommastellen resultieren)
Tut man das, kommt man (beispielsweise) zu folgendem Code:
Code: Alles auswählen
sub Rechnung
rem define variables
dim document as object
dim dispatcher as object
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Dim teilnahmen as Integer
teilnahmen = InputBox("Wie viele Personen haben teilgenommen?")
'Dim nettopreis as Double
nettopreis = teilnahmen * 4.90
dim args16(0) as new com.sun.star.beans.PropertyValue
args16(0).Name = "Text"
args16(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + teilnahmen + " x " + "4,90 = € " + nettopreis & "0" + CHR(10)
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args16())
End Sub
Es läge an Dir zu erklären was damit nicht richtig funktioniert, denn ich kann nicht wissen wie die Ausgabe denn nun ganz genau aussehen soll.
Mit einer Tabelle würde es wahrscheinlich funktionieren, da gibt es Zahlenformat: Währung.
Genau das gleiche Zahlenformat kannst Du in Basic verwenden, Thomas hat bereits darauf hingewiesen.
Gruß
Stephan
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Mo, 05.06.2017 09:41
von Björn89
komma4 hat geschrieben: ↑So, 04.06.2017 10:10
Björn89 hat geschrieben: ↑So, 04.06.2017 09:21Calc ... eine Rechnung ...formatiert
Du weisst schon, dass in CALC berechnet werden kann und die Werte dann nach WRITER (dynamisch) kopiert werden können (Stichwort:
DDE; oder auch
CALC als Datenquelle eines Serienbriefs=Rechnung).
Ich hab das mal kurz probiert, dann konnte ich die Datenbank aber nicht mehr öffnen um dort neue Datensätze einzutragen.
@Stephan
Dein Code würde für den Nettopreis zwar zwei Nachkommastellen anzeigen und das wäre auch korrekt, allerdings werden beim Bruttopreis und beim Mehrwertsteuerbetrag wieder 3 Nachkommastellen angezeigt, weil ja da mit 1.19 multipliziert wird, da kommt man um ein Runden ja nicht herum.
Wenn ich folgendes schreibe nach der bruttopreis-Berechnung
Und dann bruttopreis2 ausgebe, dann schreibt er einfach zwei zusätzliche Nullen hintendran und gibt mir damit 5 Nachkommastellen.
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Mo, 05.06.2017 11:12
von Stephan
allerdings werden beim Bruttopreis und beim Mehrwertsteuerbetrag wieder 3 Nachkommastellen angezeigt, weil ja da mit 1.19 multipliziert wird, da kommt man um ein Runden ja nicht herum.
Ja. Eine Funktion für das Runden hatte ich doch bereits angeben.
Meinethalben so zu verwenden:
Code: Alles auswählen
Sub Main
nettopreis = 1200.34
bruttopreis = nettopreis * 1.19
bruttopreis = runden(bruttopreis, 2)
Msgbox "Bruttopreis: " & format(bruttopreis, "##,##0.00 €")
End Sub
Function runden(zahl As Double, stellen)
oFunctionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")
Dim args(1) As Variant
args(0) = zahl
args(1) = stellen
runden = oFunctionAccess.callFunction( "Round", args() )
End Function
Und dann bruttopreis2 ausgebe, dann schreibt er einfach zwei zusätzliche Nullen hintendran und gibt mir damit 5 Nachkommastellen.
eigenlich muss es doch auch heissen:
bruttopreis2 = Format(bruttopreis, "#,##0.00 €")
denn auch auf einem deutschsprachigen SYstem bezieht sich format() auf die 'englische' Zahl, denn diese wird formatiert und nur ihre Ausgabe dann (automatisch) auf einem deutschen System in deutscher Schreibweise angezeigt.
Gruß
Stephan
Re: Writer: Auf 2 Nachkommastellen runden
Verfasst: Mo, 05.06.2017 14:13
von Björn89
Super! Es funktioniert jetzt genau so wie es soll!
Vielen Dank, Stephan.