Seite 1 von 1

Format in allen Zellen einer Spalte setzen [GELÖST]

Verfasst: Sa 16. Nov 2024, 15:39
von Rolf_V
Ich möchte mit einem Makro das Zahlenformat aller Zellen einer Spalte auf 114 (=Dezimalzahl mit 2 Nachkommastellen, Tausenderpunkt, negativ rot) setzen. Mein Kode sieht so aus:

Code: Alles auswählen

sub main
...
setDecInCol(4,114)
...
end sub

sub setDecInCol(S,F)
	thiscomponent.CurrentController.Select(thiscomponent.Sheets(0).getColumns().getByIndex(S))
	thiscomponent.getCurrentSelection().NumberFormat = F
end sub
Die Spalte wird zwar ausgewählt, aber dann passiert nichts. Bei Dannenhöfer und Pitonyak habe ich keine funktionierenden Vorschläge gefunden. Es kamen entweder Fehlermeldungen, mit denen ich nicht anfangen kann, oder es passierte gar nichts.
Wo liegt mein Fehler?

Re: Format in allen Zellen einer Spalte setzen

Verfasst: Sa 16. Nov 2024, 17:18
von mikele
Hallo,
woher weißt du, dass dieses Format den Key 114 hat? Bei mir passiert auch nichts, da dieser Key bei mir nicht existiert.

Re: Format in allen Zellen einer Spalte setzen

Verfasst: Sa 16. Nov 2024, 17:48
von mikele
Hallo,
um das sauber zu lösen, müsste zunächst die korrekter Nummer des Zahlenformats herausgefunden werden.
Das geht z. B. mit folgender Funktion:

Code: Alles auswählen

Function numkey (formatstring)

	Dim sLocale as New com.sun.star.lang.Locale
	NumForms = ThisComponent.getNumberFormats()
	NumKey = NumForms.queryKey(FormatString, sLocale, True)
	IF NumKey = -1 Then  '-1 means no value found for the requested format
		NumKey = NumForms.addNew(FormatString, sLocale) 'create a new key
	end if

End Function
Sie liefert die Nummer des übergebenen Zahlenformats (als formatstrings). Sollte es noch nicht existieren, wird es gleich mit angelegt.
Dann kannst du es in deinem Code verwenden, z. B. so (etwas abgewandelt):

Code: Alles auswählen

sub main
...
setDecInCol(4,"#.##0,00;[ROT]-#.##0,00")
...
end sub

sub setDecInCol(S,F)
	Thiscomponent.CurrentController.ActiveSheet.Columns(S).NumberFormat = numkey(F)
end sub
Ob für so einen Einzeiler eine extra Sub sinnvoll ist ... Wenn in der sub main die gewünschte Tabelle schon angesprochen wurde, z. B.

Code: Alles auswählen

Tabelle=ThisComponent.Sheets(0)
dann würde sich das ganze ja auf

Code: Alles auswählen

sub setDecInCol(S,F)
	Tabelle.Columns(S).NumberFormat = numkey(F)
end sub
reduzieren.

Re: Format in allen Zellen einer Spalte setzen

Verfasst: Sa 16. Nov 2024, 18:03
von Rolf_V
mikele hat geschrieben:
Sa 16. Nov 2024, 17:18
Hallo,
woher weißt du, dass dieses Format den Key 114 hat? Bei mir passiert auch nichts, da dieser Key bei mir nicht existiert.
Dafür habe ich das Makro

Code: Alles auswählen

sub ZeigeZellFormat
	msgbox thiscomponent.getCurrentSelection().NumberFormat
end sub

Re: Format in allen Zellen einer Spalte setzen

Verfasst: Sa 16. Nov 2024, 18:11
von mikele
Hallo,
dann ist eigentlich alles korrekt ...
Da du auf der 1. Tabelle arbeiten willst, reicht aber

Code: Alles auswählen

sub setDecInCol(S,F)
	Thiscomponent.Sheets(0).Columns(S).NumberFormat = F
end sub

Re: Format in allen Zellen einer Spalte setzen [GELÖST]

Verfasst: Sa 16. Nov 2024, 18:23
von Rolf_V
mikele hat geschrieben:
Sa 16. Nov 2024, 17:48
Hallo,
um das sauber zu lösen, müsste zunächst die korrekter Nummer des Zahlenformats herausgefunden werden.
Das geht z. B. mit folgender Funktion:

Code: Alles auswählen

Function numkey (formatstring)
	Dim sLocale as New com.sun.star.lang.Locale
	NumForms = ThisComponent.getNumberFormats()
	NumKey = NumForms.queryKey(FormatString, sLocale, True)
	IF NumKey = -1 Then  '-1 means no value found for the requested format
		NumKey = NumForms.addNew(FormatString, sLocale) 'create a new key
	end if
End Function
Sie liefert die Nummer des übergebenen Zahlenformats (als formatstrings). Sollte es noch nicht existieren, wird es gleich mit angelegt.
Auch mit dieser Funktion erhalte ich für dieses Format die 114
mikele hat geschrieben:
Sa 16. Nov 2024, 17:48
Ob für so einen Einzeiler eine extra Sub sinnvoll ist ... Wenn in der sub main die gewünschte Tabelle schon angesprochen wurde, z. B.

Code: Alles auswählen

Tabelle=ThisComponent.Sheets(0)
dann würde sich das ganze ja auf

Code: Alles auswählen

sub setDecInCol(S,F)
	Tabelle.Columns(S).NumberFormat = numkey(F)
end sub
reduzieren.
Mein Makro ist sehr viel länger, es werden verschiedene gleichzeitig geöffnete Tabellen angesprochen.
Genau Deine letzte Code-Zeile ist das, was ich gesucht habe.
Danke, Mikele