Seite 1 von 1

[gelöst] Eigene Funktionen mit Stadtartofficefunktionen nutzen

Verfasst: Di 24. Okt 2017, 12:10
von Don Jojo
Hi

Ich versuche gerade heraus zu finden, wie man sich in LibreOffice Calc das Leben etwas einfacher gestalten kann. Hintergrund ist der, dass ich in einer relativ großen Tabelle mit mehreren Blättern einen Eintrag umschreiben muss, der sich immer wieder periodisch wiederholt. Als Minimalbeispiel zum Nachvollziehen, kann man sich meine Situation in etwa so vorstellen:

Ich habe eine Adressliste mit Name, Vorname, Straße, Stadt. Diese Liste will ich umschreiben in eine Liste Name, Vorname, Adresse. Zusätzlich habe ich eine Übersetzungsliste, über die ich zum Beispiel italienische Stadtnamen wie Roma zu Rom oder Bolzano zu Bozen umschreiben will und dazu SVerweis nutze. Die original Adressliste erstreckt sich über mehrere Tabellenblätter und hat mehrere hundert Einträge.

Ich habe mal ein Minimalbeispiel angehängt:
minimalbeispiel.ods
(15.06 KiB) 165-mal heruntergeladen
Klar, ich kann mir einfach einmal schreiben, wie ein Eintrag umformatiert werden soll, dann die Region markieren und die Formel runterziehen, so dass sie auch in den anderen Zellen steht. Dann kopiere ich die Formeln in das nächste Tabellenblatt und so weiter. Problem ist nur, was ist wenn ich nachträglich etwas ändern will? Dann muss ich den ersten Eintrag umschreiben, wieder nach unten ziehen, kopieren und so weiter. Das würde ich gerne vermeiden. Meine Frage ist: Wie kann ich das vermeiden?

Mein Wunsch wäre es, dass ich zum Beispiel für die Adresse eine eigene Funktion schreibe mit dem Namen ADRESSE(STRASSE, STADT) und dann in der Zelle einfach reinschreibe "=ADRESSE(B12;B13)". Das kann ich dann runterziehen, und wenn ich nachträglich etwas ändern will, weil mir zum Beispiel die Formatierung der Adresse nicht gefällt und ich zuerst den Stadtnamen und dann die Straße haben will, dann kann ich einfach die Funktion umschreiben und habe automatisch in jeder Zelle die neue Formatierung ohne viel mit Copy-und-Paste arbeiten zu müssen.

Problem: Ich habe ein bisschen mit LibreOffice Basic herumgespielt, aber dort kann ich Funktionen wie SVERWEIS() nicht aufrufen. Da bekomme ich immer den Fehler "BASIC-Laufzeitfehler. Sub- oder Function-Prozedur nicht definiert." Eine andere Alternative habe ich noch nicht gefunden. Und die Funktion SVERWEIS nochmal komplett neu zu programmieren, kann ist ja auch nicht besonders zielführend. Gibt es irgend eine vernünftige Lösung für das was ich suche?

Liebe Grüße
Jojo

Re: Eigene Funktionen mit Stadtartofficefunktionen nutzen

Verfasst: Mi 25. Okt 2017, 09:13
von mikele
Hallo,
wenn ich dich richtig verstehe, hast du eine Art Datenbank mit
1) diversen Adressen (Name, Vorname, Ort, Straße)
2) einer "Übersetzungstabelle"
Dies soll auch so bleiben (ansonsten wäre das folgende ein einmaliger Akt).
Du möchtest eine Funktion, die dir aus der Straße und dem Ort (mit evtl. Übersetzung) eine "zusammengesetzte" Adresse baut.
Die Art der Zusammensetzung möchtest du aber variieren können.
Lösbar ist es auf alle Fälle per eigens programmierter Funktion:
Function Adresszeile_udf(strasse as string, ort as string, uebersetzung as array)
for i=1 to ubound(uebersetzung(),1)
if uebersetzung(i,1)=ort then
ort=uebersetzung(i,2)
i=ubound(uebersetzung(),1)
end if
next
adresszeile_udf=strasse & ", " & ort
End Function
In der Schleife wird nach einer Übersetzung gesucht und zuletzt die Adresszeile nach Wunsch zusammengesetzt.

Re: Eigene Funktionen mit Stadtartofficefunktionen nutzen

Verfasst: Mi 25. Okt 2017, 16:38
von Helmut_S
Hallo Don Jojo, wenn du Calc-Tabellenfunktionen in einem Makro verwenden willst, musst du englischsprachige Funktionsnamen verwenden.
Siehe dazu diese Seite aus Michael Dannenhöfers Starbasic-Faq
http://www.dannenhoefer.de/faqstarbasic ... l#Zweig229
sowie
http://www.dannenhoefer.de/faqstarbasic ... funktionen
Gruß Helmut

Re: Eigene Funktionen mit Stadtartofficefunktionen nutzen

Verfasst: Do 26. Okt 2017, 14:23
von Don Jojo
Hallo

Vielen Dank für eure Antworten. Ich habe beide Lösungen ausprobiert und sie funktionieren beide super. Dankeschön :D!

Welcher Lösung ich den Vorzug geben werde, werde ich in den nächsten Tagen ausprobieren.

Eine kurze Ergänzung noch. Ich wollte eigentlich fragen, wie man in Basic-Funktionen auf statische Array-Bereiche zugreifen kann. Die Lösung habe ich dann beim googlen (Treffer 1, Treffer 2) aber selber gefunden. Weil der folgende Code funktioniert zwar, hat aber einen Nachteil: Wenn ich die Übersetzungsliste "translations" jedesmal in den Funktionsaufruf packen muss und die Liste am Ende noch erweitern will, dann muss ich diesen Eintrag wieder in allen Zellen ändern. Das ist wieder mal so was unerwünschtes.

Code: Alles auswählen

Function Stadt(location as string, translations as array)
	Dim args( 3 ) As Variant
		args(0) = location
		args(1) = translations
		args(2) = 2
		args(3) = 0

	Fct = createUnoService( "com.sun.star.sheet.FunctionAccess" )
	Stadt =  Fct.callFunction("VLOOKUP",args())
End Function
Die Lösung ist recht simpel und sieht so aus:

Code: Alles auswählen

Function Stadt(location as string)
	Doc = ThisComponent   'das Dokumentenobjekt
	Sheet = Doc.sheets(0)  ' das erste Tabellenblatt
	translations = Sheet.getCellRangeByName("A5:B6")  'die Zellen A5 bis B6

	Dim args( 3 ) As Variant
		args(0) = location
		args(1) = translations
		args(2) = 2
		args(3) = 0
        
	Fct = createUnoService( "com.sun.star.sheet.FunctionAccess" )
	Stadt =  Fct.callFunction("VLOOKUP",args())
End Function
Funktioniert ebenfalls einwandfrei. Ich habe gedacht, ich ergänze das einfach noch, weil andere vielleicht auf die selbe Frage stoßen werden.

Vielen Dank für eure Hilfe. Ihr habt mir mit LibreOffice jetzt eine neue Dimension der Möglichkeiten eröffnet :D

Liebe Grüße
Jojo

Re: [gelöst] Eigene Funktionen mit Stadtartofficefunktionen nutzen

Verfasst: Do 26. Okt 2017, 17:19
von mikele
Hallo,
hat aber einen Nachteil: Wenn ich die Übersetzungsliste "translations" jedesmal in den Funktionsaufruf packen muss und die Liste am Ende noch erweitern will, dann muss ich diesen Eintrag wieder in allen Zellen ändern.
Das Problem kannst du am einfachsten dadurch umgehen, indem du dem Übersetzungsbereich (aktuell A5:B6) einen Namen gibst, z. B. translations. Dann kannst du den Funktionsaufruf mit dem Namen machen.