CALC: Spalte mit Währung formatieren

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

Moderator: Moderatoren

Tom1980

CALC: Spalte mit Währung formatieren

Beitrag von Tom1980 » Fr, 05.05.2017 11:53

Hallo,

ich möchte mittels Makro in meiner Tabelle verschiedene Spalten mit Währung Formatieren.
Ich habe das Makor aufzeichnen lassen:

Code: Alles auswählen

rem -----------------------------------------------------------------------------------
rem -------------- Hier wird der Bereich ausgewählt ---------------------------
dim args37(0) as new com.sun.star.beans.PropertyValue
args37(0).Name = "ToPoint"
args37(0).Value = "$L$2:$L$32"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args37())

rem --Hier soll der Bereich in der Form formatiert werden-------------------
rem ---------- > #.##0,00 [$€-407];[ROT]-#.##0,00 [$€-407] <--------------
dim args38(0) as new com.sun.star.beans.PropertyValue
args38(0).Name = "NumberFormatValue"
args38(0).Value = 106

dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args38())

rem -----------------------------------------------------------------------------------

leider klapt das nicht so richtig. Mal geht es und mal nicht.

Eine weitere Aufzeichnung ergab einen anderen Value – wert → args38(0).Value = 107

Ich würde gern die beiden Zeilen:

args38(0).Name = "NumberFormatValue"
args38(0).Value = 106
ersetzen mit einer Form die etwa so aussieht:

> #.##0,00 [$€-407];[ROT]-#.##0,00 [$€-407] <

Ich habe aber keine Ahnung welche Befehle dafür nötig sind. Ich möchte nur sichergehen , dass das Makro dann die Währung in dieser form schreibt.

Es wäre ganz toll wenn mir jemand diese beiden Zeilen ersetzen könnte und ich sie dann in mein Makro übernehmen kann.

Vielen dank für die Mühe, ich hoffe ich habe mich verständich ausgedrückt.


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

Karolus
********
Beiträge: 7063
Registriert: Mo, 02.01.2006 19:48
Kontaktdaten:

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von Karolus » Fr, 05.05.2017 12:25

Hallo

Warum soll das per Makro geschehen, obwohl exakt dieses Format über einen Button in der Format-Symbolleiste einstellbar ist ??
AOO4, LO4.3, LO4.4 LinuxMint17.2

clag
********
Beiträge: 3547
Registriert: Di, 27.01.2009 15:30

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von clag » Fr, 05.05.2017 12:40

Hallo Tom1980,

also der aufgezeichnete Code funktioniert einwandfrei
manuel getschriebeb wäre es ein Einzeiler

Code: Alles auswählen

 ThisComponent.Sheets(0).getCellRangeByName("L2:L32").Numberformat=107
vermutlich ist ein anderer Umstand die Ursache für dein Problem.

test Datei
format_test.ods
(11.94 KiB) 62-mal heruntergeladen
LG
clag

nutzt: WinXP SP3 / AOO 4.1.2 / Firefox

Toxitom
********
Beiträge: 3486
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von Toxitom » Fr, 05.05.2017 19:44

Hey Tom, Clag,

ganz so einfach geht es leider nicht.

Der NummernFormat Code ist leider nicht automatisch da in einer Datei. Wenn Ihr eine leere Datei starten würdet und den Code direkt laufen last, so wird entweder gar nichts passieren oder es gibt einen Basic-Runtime Error - "nicht erkannter Code".

Das liegt daran, dass die Nummernformate eben erst dann im Dokument erzeugt und gespeichert werden, wenn sie auch zum Einsatz kommen. Also: Wird irgendeine Zelle mit dem Währungsformat formatiert steht der Code (Nummer) zur Verfügung - vorher nicht.

Um beim Makro also sicher zu sein, muss zuerst geprüft werden, ob es den Nummern-Formatcode schon gibt - wenn nicht, muss er zunächst erzeugt werden (geht auch per Makro) - dann kann man ihn zuweisen.

Das ist ein bischen Aufwand - insofern würde ich die Variante von Karolus eher empfehlen: Ein Klick auf den passendne Button in der UI - fertig :)

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic

Benutzeravatar
balu
********
Beiträge: 3664
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von balu » Sa, 06.05.2017 00:34

Hallo Leute,

es wird mal langsam wieder Zeit das ich auch ein wenig mitmische. Und deshalb schalte ich in den "Klugscheißer-Modus" :lol:
Karolus hat geschrieben: Warum soll das per Makro geschehen, obwohl exakt dieses Format über einen Button in der Format-Symbolleiste einstellbar ist ??
Würde mich auch interessieren. Aber vielleicht dient das ja als Übung für andere Währungsformate, wer weiss?


@Tom
Toxitom hat geschrieben: ganz so einfach geht es leider nicht.
Teilweise stimt das, aber andserseits auch wiederum nicht.

Toxitom hat geschrieben: Der NummernFormat Code ist leider nicht automatisch da in einer Datei. Wenn Ihr eine leere Datei starten würdet und den Code direkt laufen last, so wird entweder gar nichts passieren oder es gibt einen Basic-Runtime Error - "nicht erkannter Code".
Dem kann ich zustimmen.
Jedoch, und jetzt kommen wir zur gegensätzlichen Behauptung, stimmt das nicht immer. Denn wenn es um Datum und Zeit geht, dann kann man auch in einer neuen und leeren Datei folgenden Code laufen lassen.

Code: Alles auswählen

sub Main
ThisComponent.Sheets(0).getCellRangeByName("L2").Numberformat = 40
end sub
Und wenn in L2 folgender Wert steht: 12345, dann wird auch die Formatierung angewendet.
In OO.o 3.2.1 würde das dann so aussehen.
In der Zelle L2 ist dann das hier zu sehen: 00:00
Aber oben in der Eingabezeile steht dort folgendes: 296280:00:00

Und in LO 5.1.5.2 sieht das dann wie folgt aus.
In der Zelle L2 ist dann das hier zu sehen: 00:00
Aber oben in der Eingabezeile steht dort folgendes: 18.10.1933 00:00:00

Zwischen den beiden genannten Officen gibt es wohl einen winzig kleinen Unterschied, der jetzt aber nicht von Interesse ist, da hiermit bewiesen ist das eine direkte Formatierung bei Datum und Zeit durchaus funktioniert.

Warum das aber bei Währung nicht funktioniert, verstehe ich momentan auch nicht, bleibt mir erstmal ein Rätsel. Und deshalb dachte ich mir so: "Vielleicht hilft es ja, wenn ich einen bestimmten Modus einschalte? Denn diesen Modus habe ich ja für Datum und Zeit schon erfolgreich angewendet."
Und dieser Modus lautet: CompatibilityMode

Code: Alles auswählen

sub Main
CompatibilityMode(True)
	ThisComponent.Sheets(0).getCellRangeByName("L2").Numberformat = 107
CompatibilityMode(False)
end sub
Aber der hilft auch nicht.
Also einen Schritt weiter, der wiederum nur bei Datum und Zeit funktioniert.

Code: Alles auswählen

sub Main
CompatibilityMode(True)
	ThisComponent.Sheets(0).getCellRangeByName("L2").FormulaLocal =  FormatDateTime(TimeValue(NOW), 4) ' = Uhrzeit
	ThisComponent.Sheets(0).getCellRangeByName("L2").Numberformat = 40
CompatibilityMode(False)
end sub
Vielleicht müsste ja nur FormatDateTime durch den richtigen "Befehl" ersetzt werden, damit auch die Währung direkt angewendet werden kann und zwar ohne irgendwie vorher etwas auszulesen? Jedoch weiss ich momentan nicht wie der passende "Befehl" lautet.

So, das wars auch schon, und ich schalte den "Klugscheißer-Modus" wieder aus. *lach-lach-lach*



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D

Tom1980

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von Tom1980 » Sa, 06.05.2017 01:02

Hi,

vielen Dank für eure Antworten.

@Karolus , die Warum willst du das machen – Frage liebe ich #Ironie.

Stelle dir folgendes Szenario vor. Ich exportiere eine Datei von externer Herkunft in CSV-Format. Alle Zahlen sind in Standard-Format in den Tabellen aufgelistet. Die Datei hat 30 Sheets also 30 Tabellen (für jeden Mitarbeiter eine).
Jeder Mitarbeiter hat Spalten für:
Schichtanfangsdatum; Uhrzeit; Schichtenddatum; Uhrzeit ; Schichtdauer;
Anzahl der Positionen(7%); Umsatz 7%; Anzahl der Positionen(19%); Umsatz 19% ; Anzahl der Positionen(bar); Umsatz bar; Anzahl der Positionen unbar;…….usw.

Jede Tabelle enthält 10 Spalten die eine Währung erfordern, 6 Spalten die eine Uhrzeit ohne Sekunden auflisten soll….. usw. es sind insgesamt 26 Spalten zu Formatieren das mal 30 für jeden Mitarbeiter und es soll auch jeden Monat neu gemacht werden.
Deshalb möchte ich ein Makro benutzen, das über eine Funktionstaste aufgerufen wird und diese Sandartarbeit in einem Rutsch erledigt.


@clag, deinen Code habe ich getestet, der funzt sicher, vielen Dank. Und ja ich habe den Fehler nicht wieder provozieren können, trotzdem habe ich von einem genialen Kopf diese Lösung Bekommen, welche genau das macht was ich haben wollte.

Code: Alles auswählen

Sub Main

	rem ============= Formatieren ohne Value =========
	dim nfService as object
	dim formatStandardWaehrung as long
	dim formatStringStandardWaehrung as string
    dim aLocale as new com.sun.star.lang.Locale
	nfService = ThisComponent.getNumberFormats()
	rem ==============================================



	rem ============= Formatieren ohne Value =========	
	formatStringStandardWaehrung = "#.##0,00 [$€-407];[ROT]-#.##0,00 [$€-407]"
	formatStandardWaehrung = nfService.queryKey(formatStringStandardWaehrung, aLocale, false)
	if (formatStandardWaehrung = -1) then 
		formatStandardWaehrung = nfService.addNew(formatStringStandardWaehrung, aLocale)
	end if
	
	ThisComponent.Sheets(0).getCellRangeByName("A1:A10").NumberFormat=formatStandardWaehrung
	rem ==============================================	
		
End Sub
[code]
Vielen Dank nochmal an Alle
Groß Tom

clag
********
Beiträge: 3547
Registriert: Di, 27.01.2009 15:30

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von clag » Sa, 06.05.2017 06:29

Moin in die Runde,
Toxitom hat geschrieben:
Fr, 05.05.2017 19:44
ganz so einfach geht es leider nicht.
bei mir mit AOO schon !?
Toxitom hat geschrieben:
Fr, 05.05.2017 19:44
Der NummernFormat Code ist leider nicht automatisch da in einer Datei. Wenn Ihr eine leere Datei starten würdet und den Code direkt laufen last, so wird entweder gar nichts passieren oder es gibt einen Basic-Runtime Error - "nicht erkannter Code".
Dieses Verhalten kan ich nicht feststellen.

ich starte AOO, erstelle ein neues Calc Dokument und schreibe in eine beliebige Zelle eine Zahl, dann rufe ich folgendes Makro auf

Code: Alles auswählen

sub setMoneyFormat
 ThisComponent.currentSelection.Numberformat=107
end sub 

und schon ist das Format für die markierten Zellen gesetzt !
Keine Fehlermeldung und kein anderes AOO Gemecker.

Aber da du deine Anmerkung sicher nicht geschrieben hast um mich zu ärgen,
frage ich mich natürlich was könnte sonst der Grund sein?
Zumal @Balu das Verhalten teilweise bestätigt!
Habt ihr beide das aktuell gecheckt oder ist das vielleicht nur für ältere AOOs gültig?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.2 / Firefox

Benutzeravatar
balu
********
Beiträge: 3664
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von balu » Sa, 06.05.2017 07:40

Moin moin!
clag

nutzt: WinXP SP3 / AOO 4.1.2 / Firefox
Ich auch.
Und dennoch funktioniert dein Code bei mir nicht, egal welches Office und Version.
Von OO.o und LO hatte ich ja berichtet. Und grad eben zusätzlich noch in AOO 4.1.2.

Mit

Code: Alles auswählen

Sub Main
 ThisComponent.Sheets(0).getCellRangeByName("L2:L32").Numberformat=107
End Sub
geschieht gar nix, wenn Datei neu und von Hand im angegebenen Bereich Werte eingetragen wurden, und anschließend dieser Code in die BASIC-IDE reinkopiert wurde und ausgeführt wird.

Nur mit

Code: Alles auswählen

Sub Main
 ThisComponent.Sheets(0).getCellRangeByName("L2:L32").Numberformat=40
End Sub
werden die zuvor eingetragenen Werte dementsprechend auf Zeit eingestellt, HH:MM.
Ich hatte ja zuvor gesagt "Datum und Zeit", was natürlich korrekter Weise in diesem Falle nur Zeit heißen muss. Aber was mit Zeit geht, geht auch mit Datum.

Ich kann mir auch keinen Reim darauf machen, warum laut clag seiner Aussage bei ihm es funktioniert, aber bei mir nicht.

Clag, was für eine Spracheinstellung hast Du denn in deinem Office, und ist die oben zitierte Version bei dir noch aktuell?



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D

Toxitom
********
Beiträge: 3486
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von Toxitom » Sa, 06.05.2017 08:08

Hallo Clag, Balu und alle anderen,

also ich verwende LO in verschiedenen Versionen - und ich habe meinen Beitrag aus dem Gedächtnis heraus geschrieben.

Nur noch mal zur Erläuterung:
Die Nummerncodes werden erst bei der Verwendung erzeugt - sie sind nicht automatisch vorhanden. Vielleicht mit einer kleinen Einschränkung: Ich schätze (nicht getestet) eine Handvoll Standard-Nummerncodes sind immer vorhanden - in englischer Notation. Insbesondere aber alle lokalisierten Codes existieren zunächst nicht.

Um einen Code in einem Dokument zu testen, bedarf es zweier Parameter: Eines Formatcodes ("String") sowie eines Structs (Lokale).

Wenn man also in einer Datei per Makro einen Formatcode setzen will, sollte immer zuerst geprüft werden, ob es den überhaupt schon gibt - ansonsten sollte er erzeugt werden. Das folgende Beispiel ist ein solcher Code:

Code: Alles auswählen

sub setMoneyFormat
 'ThisComponent.currentSelection.Numberformat=107
  dim aLocale As New com.sun.star.lang.Locale
  Dim sWFormat As String
  Dim nCurFormat As integer
  
  sWFormat = "0,00 €"
 
  oFormats = thisComponent.NumberFormats
  nCurFormat = oFormats.queryKey(sWFormat, aLocale, True )
  If nCurFormat < 0 Then 
    nCurFormat  = oFormats.addNew(sWFormat, aLocale )
  End if
  
  ThisComponent.currentSelection.Numberformat=107
  
end sub 
Der gewünschte Code wird zunächst geprüft, ob es ihn schon gibt..wenn nicht, wird er erzeugt. Ich würde im Übrigen in der letzen Zeile nicht die Nummer 107 nehmen (auch wenn die zufällig stimmt) sondern immer die Variable nCurFormat - nur so ist sicher, dass der erzeugte Code auch tatsächlich zugewiesen wird;)

Tatsächlich sind eine Menge Nummern vorcodiert und die Nummern werden immer wieder verwendet (intern) - insofern funktioniert hier auch direkt die Nummer 107.

Das Verhalten ist im Übrigen in allen OpenDocument Dokumenten ähnlich - also auch bei Writer oder Impress (dort betrifft es meist das Datumsformat).

@Clag: Dein Code funktioniert hier bei mir in einem leeren Dokument nicht (Win 10, LO 5.3.2) - wie erwartet.

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic

Tom1980

Re: CALC: Spalte mit Währung formatieren

Beitrag von Tom1980 » Sa, 06.05.2017 19:09

Hi,
noch mal.
Erst brennt ihr darauf den Grund für mein Anliegen zu erfahren und dann wird selbst die Lösung ignoriert, zumal ihr meines Erachtens das Thema nur am Rande diskutiert. Warum, wann, welcher Fehler auftritt. Programme und User sind manchmal Fehlerhaft - egal.

Ich hab die Lösung schon gepostet.

Gruß Tom1980

Antworten