CALC: Spalte mit Währung formatieren

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

Moderator: Moderatoren

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

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von Karolus »

Hallo

Warum soll das per Makro geschehen, obwohl exakt dieses Format über einen Button in der Format-Symbolleiste einstellbar ist ??
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von clag »

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) 157-mal heruntergeladen
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von Toxitom »

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: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von balu »

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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von clag »

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.10 / Firefox
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von balu »

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: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Makro soll Spalte mit Wärung formatieren

Beitrag von Toxitom »

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
Antworten