NamedRanges: wie richtig Formel zuweisen?

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

Moderator: Moderatoren

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

NamedRanges: wie richtig Formel zuweisen?

Beitrag von balu »

Hallo liebe Gemeinde,

per Makro in Calc einen Zellbereich einen Namen zuzuordnen ist kein Problem. Wenn ich jedoch das gleiche mit einer Formel versuche, dann funktioniert das nicht so wie gewünscht.

Nehmen wir mal an, ich will diese Formel per Makro einen Namen zuordnen,

Code: Alles auswählen

WENN(B1=1;2;SUMMENPRODUKT(1=D1:D2;1=E1:E2))
dann wird das dementsprechende Makro ohne Fehlermeldung auch ausgeführt, aber bei einer gegenkontrolle im "Namen festlegen" Fenster steht dann folgendes.

Code: Alles auswählen

wenn(B1=1;2;summenprodukt(1=D1:D2;1=E1:E2))
Und dadurch ist dann der dementsprechende Name für die Formel in einem Tabellenblatt nicht lauffähig, da es zur Fehlermeldung #NAME? kommt.

Was mir aber aufgefallen ist, wenn ich den Namen im "Namen festlegen" Fenster anklicke und kontrolliere und mit Abbrechen das Fenster verlasse, dann bleibt die Formel so wie nicht gewünscht stehen. Verlasse ich aber das Fenster nach dem anwählen des Namen mit OK, dann steht die Formel bei einer erneuten Kontrolle wie gewünscht da. Und dann funktioniert auch der Name im Tabellenblatt.

Das finde ich irgendwie sehr märkwürzik.


Jetzt komme ich zu einem weiteren Teil den ich nicht wirklich versteh.

Wenn ich die obige Formel NICHT in deutsch, sondern in englisch eintrage, also so

Code: Alles auswählen

IF(B1=1;2;SUMPRODUCT(1=D1:D2;1=E1:E2))
dann steht die Formel bei einer Kontrolle im "Namen festlegen" Fenster in der deutschen schreibweise, also genau so wie gewünscht.

Hier der Testcode.

Code: Alles auswählen

sub NamenFuerFormel
	Dim sFuerName as String
	Dim sNameFormel as String
	dim Bez_addr as new com.sun.star.table.CellAddress
	
		sFuerName = "WENN(B1=1;2;SUMMENPRODUKT(1=D1:D2;1=E1:E2))"
		'sFuerName = "IF(B1=1;2;SUMPRODUCT(1=D1:D2;1=E1:E2))"
		'sFuerName = "$Tabelle1.$B$3:$D$6"
		sNameFormel = "TestFormel"

		with Bez_addr
			.sheet = 0
			.column = 0
			.row = 0
		end with

	ThisComponent.NamedRanges.AddNewByName(sNameFormel, sFuerName, Bez_addr, 0)
		'ThisComponent.calculate
end sub
Jetzt frage ich Euch
-> warum funktioniert die englische schreibweise, aber nicht die deutsche?
-> wie muss ich den Code ändern, damit auch die deutsche schreibweise funktioniert?

Ich habe keine Lust darauf den Namen jedesmal zu kontrollieren und mit OK zu bestätigen, da ich ja sonst gleich alles von Hand machen kann, also ohne Makro.


Freue mich auf eure Antworten, und bedanke mich schon mal für eure Bemühungen :) .



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
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: NamedRanges: wie richtig Formel zuweisen?

Beitrag von Karolus »

Hallo
> warum funktioniert die englische schreibweise, aber nicht die deutsche?
Weil die lokalisierten Namen im Prinzip nur existieren "auf der lokalisierten Calc-Bedienungs-oberfläche"
> wie muss ich den Code ändern, damit auch die deutsche schreibweise funktioniert?
Um Zellen direkt mit Formeln zu bestücken gibts ...FormulaLocal -- für deine Fragestellung müsstest du dir wohl eine Funktion stricken die den Lokalisierten Namen entgegennimmt und den englischen zurückgibt.

Code: Alles auswählen

oFunctionDescript = createUnoService( "com.sun.star.sheet.FunctionDescriptions")
ofunctionMapper = createUnoService( "com.sun.star.sheet.FormulaOpCodeMapper" )
wären dann interessant.

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: NamedRanges: wie richtig Formel zuweisen?

Beitrag von balu »

Hallo Karo,

danke für deine rasche Antwort.

Ich hatte heute morgen in der Früh (ca.02:30) auch schon an FormulaLocal gedacht, war da aber zu übermüdet um in dieser Richtung weiterzuforschen. Werd mal schaun wie ich deinen Tipp nutzbringend anwenden kann, und melde mich dann wieder. Egal ob mit Erfolg, oder mit Problemchen.



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
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: NamedRanges: wie richtig Formel zuweisen?

Beitrag von Karolus »

Hallo

Nicht das du mich falsch verstehst, .FormulaLocal ist ein Attribut von Zellen das nutzt dir nichts zum Definieren von ..NamedRanges

Du bräuchtest ja etwas was dir automatisch eine Formel übersetzt, zb.:

Code: Alles auswählen

"WENN(B1=1;2;SUMMENPRODUKT(1=D1:D2;1=E1:E2))"
zu

Code: Alles auswählen

"IF(B1=1;2;SUMPRODUCT(1=D1:D2;1=E1:E2))"
Edit:
Evtl könntest du Calc als Übersetzungservice missbrauchen, indem du die Formel per..FormulaLocal in eine Zelle schreibst, um sie gleich wieder als ..Formula auszulesen. :idea:
/Edit

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: NamedRanges: wie richtig Formel zuweisen?

Beitrag von balu »

Hallöchen,
Nicht das du mich falsch verstehst, .FormulaLocal ist ein Attribut von Zellen das nutzt dir nichts zum Definieren von ..NamedRanges
ja is scho klar. Du wolltest mich darauf hinweisen, das die Formel eine Lokalisierte angelegenheit ist, aber das dies nicht im Makro funktioniert.

Evtl könntest du Calc als Übersetzungservice missbrauchen
Nicht eventuel. Ich habs damit gemacht, und es funzt. Ist wohl vielleicht nicht die feinste Methode, aber das Ziel lässt sich damit ganz easy erreichen.

Hier der geänderte und funktionierende Code.

Code: Alles auswählen

sub NamenFuerFormel
	Dim sFuerName as String, sNameFormel as Strings
	Dim oTab1 as Object
	Dim Bez_addr as new com.sun.star.table.CellAddress

	oTab1 = ThisComponent.sheets.getByName("Tabelle1")	
	oTab1.getCellRangeByName("A1").FormulaLocal = "=WENN(B1=1;2;SUMMENPRODUKT(1=D1:D2;1=E1:E2))"	
	sFuerName = oTab1.getCellRangeByName("A1").Formula

	oTab1.getCellRangeByName("A1").clearContents(255)

	sNameFormel = "TestFormel"

		with Bez_addr
			.sheet = 0
			.column = 0
			.row = 0
		end with

	ThisComponent.NamedRanges.AddNewByName(sNameFormel, sFuerName, Bez_addr, 0)
end sub
Und damit kann ich leben :).



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
Antworten