eigene Funktion in Datei gespeichert

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

Moderator: Moderatoren

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

eigene Funktion in Datei gespeichert

Beitrag von clag »

Hallo Kenner und Könner,

wieso tut eine "eigene Funktion" nicht gleich nach dem Start von OO und öffnen der Datei,
wenn die Funktion in der Datei abgelegt ist?

Es gibt beim öffnen der Datei Fehlermeldungen "Objektvariable nicht belegt"
nach dem man die Meldungen weggedrückt hat und einem ctrl+sift+F9 gehts dann doch?

Meine Frage bezieht sich auf diese Beispieldatei
viewtopic.php?f=2&t=65982#p256898

und kann man das irgend wie diese Startprobleme verhindern?
Ja ich weiß eine Funktion gehört eigentlich in der Bibliothek Standard Funktion abgelegt, aber wieso klemmt es nur beim Start ?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7442
Registriert: Mo, 02.01.2006 19:48

Re: eigene Funktion in Datei gespeichert

Beitrag von Karolus »

Scheint ein Fehler in AOO zu sein, mit LO funktioniert das beim Öffnen der Datei.

Anbei noch eine Variante mit WENNFEHLER (LO) und PYJOIN (ADDinn von mir***)

***pyjoin
finde_marke.ods
(18.4 KiB) 69-mal heruntergeladen
update:
eine Formel die nur pyjoin benötigt:

Code: Alles auswählen

=PYJOIN(WENN(ISTFEHLER(FINDEN(G$2:G$11;A2));"";G$2:G$11);"")
als Matrixformel
Zuletzt geändert von Karolus am Fr, 03.07.2015 09:21, insgesamt 1-mal geändert.
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: eigene Funktion in Datei gespeichert

Beitrag von Stephan »

wieso tut eine "eigene Funktion" nicht gleich nach dem Start von
OO und öffnen der Datei,
wenn die Funktion in der Datei abgelegt ist?
augenscheinlich weil das Referenzieren von .CurrentController nicht klappt.
und kann man das irgend wie diese Startprobleme verhindern?


Am Einfachsten indem Du das Blatt fest vorgibst:

Code: Alles auswählen

oSheet = ThisComponent.Sheets().getByIndex(0)
was natürlich nicht besonders flexibel ist.
Um es flexibler zu machen könnte man die Information über das jeweils aktuelle Sheet irgendwo zwischenspeichern, alternativ wäre es wohl besser auf die Funktionen SUCHEN() oder FINDEN() im Makro zurückzugreifen:
http://www.dannenhoefer.de/faqstarbasic ... enden.html



Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eigene Funktion in Datei gespeichert

Beitrag von clag »

Hallo Karolus,

erst einmal Danke, das du dich mit dem Problem beschäftigt hast.
Dann muss man unter AOO wohl zwingend in die Standard Bibliothek Funktionen speichern!?

Aber dein alternativ Vorschlag klemmt bei mir ebenfalls, deine Formel gibt "Name?" aus undd "iferror" ist kleingeschrieben,
wird also micht gefunden, obwohl ich deine Texttools installiert habe?

hmmm
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7442
Registriert: Mo, 02.01.2006 19:48

Re: eigene Funktion in Datei gespeichert

Beitrag von Karolus »

Ich schrieb WENNFEHLER (LO)
Die Funktion gibts nur in Libreoffice

Ich hab oben noch eine Variante ohne WENNFEHLER hinzugefügt.
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: eigene Funktion in Datei gespeichert

Beitrag von clag »

Hallo Stephan,

dir natürlich auch allerbesten Danke für deine Aktivität, werde gleich mal versuchen das umzusetzen
Stephan hat geschrieben:alternativ wäre es wohl besser auf die Funktionen SUCHEN() oder FINDEN() im Makro zurückzugreifen:
worauf beziehst du das, auf INSTR() und warum?

edit:
ich verwende diese nativen Funktionen wie InStr() von OOBasic im Glauben, das diese schneller sind, ist das ein Irrglaube?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: eigene Funktion in Datei gespeichert

Beitrag von Stephan »

worauf beziehst du das
auf die Tabellenfunktionen gleichen Namens, weswegen ich ja sauch schon auf die STarBasic-FAQ verwiesen hatte wo die Anwendung solcher Funktionen in Makros beschrieben ist.
auf INSTR()
nein.
und warum?
weil ich hoffe das, unter den gegebenen Rahmenbedingungen, mithilfe von SUCHEN() oder FINDEN() keine explizite Angabe des Tabellenblatts im Makro nötig ist, ausprobiert habe ich es nicht.

Ebenso kannst Du die Tabellenfunktion TABELLE() zur Parameterübergabe nutzen, wenn Du Deine Benutzerdefinierte Funktion umbaust:

Code: Alles auswählen

FUNCTION EXTRACTIF(tabelle As Integer LongText, Search as string)
'diese Funktion ermittelt ob ein Begriff aus dem Bereich Search im String LongText enthalten ist 
oSheet = Thiscomponent.Sheets()getByIndex(tabelle-1)
sRange = oSheet.GetCellRangeByName(Search)
iScol = sRange.GetRangeAddress.StartColumn
iSrow = sRange.GetRangeAddress.StartRow
   for i=0 to sRange.rows.count -1
      if inStr(LongText,oSheet.GetCellByPosition(iScol,iSrow+i).string) > 0 then
         EXTRACTIF = oSheet.GetCellByPosition(iScol,iSrow+i).string
         exit function
      end if
   next
   EXTRACTIF = ""
End FUNCTION
und sie (beispielhaft) wie folgt im Tabellenblatt aufrufst:

=EXTRACTIF(TABELLE();A2;"G2:G7")



Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eigene Funktion in Datei gespeichert

Beitrag von clag »

Hallo Stephan,
erst einmal danke für deine weiteren Erläuterungen.

Auf Grund der Nachfrage im Ausgangsthread nach einer Tabellenblatt übergreifenden Lösung,
habe ich an einen benannten Bereich für die Liste gedacht.
Aber irgend wie verhedert sich AOO damit oder ich verwende es falsch?

Ich habe folgendes

Code: Alles auswählen

sRange = thiscomponent.namedRanges(search).ReferredCells
oSheet = thiscomponent.namedRanges(search).ReferredCells.Spreadsheet


das funktioniert
aber es funktioniert mit jeden beliebigen Namen als "search" der Name wird überhauptnicht ausgewertet ???
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: eigene Funktion in Datei gespeichert

Beitrag von balu »

Moin clag,
aber es funktioniert mit jeden beliebigen Namen als "search"
Na wenn das nur nicht mit "search" funktioniert, dann wird das wohl seine Gründe haben. Schon mal überlegt das "search" der *englische* Begriff für die Calc-Funktion =SUCHEN() ist?

Manchmal sollte man es sich nicht zu einfach machen, mit der vergabe von "Namen".

Was hällst Du denn von: "searching"?



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
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: eigene Funktion in Datei gespeichert

Beitrag von Stephan »

Auf Grund der Nachfrage im Ausgangsthread nach einer Tabellenblatt übergreifenden Lösung,
habe ich an einen benannten Bereich für die Liste gedacht.


es spricht nichts dagegen, nur erkenne ich auch keinen Vorteil, denn ob Du im Makro den Tabellennamen oder den Namen eines Bereichs angibst ändert doch nichts daran das Du überhaupt einen Namen fest angeben musst.
Ich habe folgendes
ich kenne zwar nicht den Inhalt der Variable search, aber ja, das scheint mit jedem Namen zu funktionieren, was ein Fehler in OO sein dürfte ... NUR sind doch beide Codezeilen ohnehin sinnfrei, denn wenn search den Namen des Bereiches enthält erfolgt doch der Zugriff mittels:

Code: Alles auswählen

ThisComponent.NamedRanges.getByName(search)
das ist dann aber auch schon das richtige Zellbereichsobjekt, weswegen es unnötig ist daraus erst den Tabellennamen auslesen zu wollen.

(Im Übrigen würde ich einen Begriff wie "search" als Variablennamen meiden, zwar ist wohl im Konkreten "search" kein Schlüsselwort in StarBasic, aber mich würde das trotzdem nervös machen)


Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: eigene Funktion in Datei gespeichert

Beitrag von clag »

Hallo zusammen,

besten Dank für eure Unterstützung.
Ja "search" war sicherlich nicht besonders clever gewählt. Ich werde versuchen mich zu bessern.

Stephans Hinweis ist den auch gleich die Lösung für das "Problem"
ich hatte ja einen String an eine Anweisung übergeben die eine Index Angabe erwartet und jeder übergebene String
wurde scheinbar als 0 gewertet und somit wurde immer der erste verfügbare benannte Bereich angesprochen.

Code: Alles auswählen

falsch
sRange = thiscomponent.namedRanges(sName).ReferredCells
richtig
sRange = ThisComponent.NamedRanges.getByName(sName).ReferredCells

und wie so oft im Leben, kaum macht man etwas richtig, schon funktioniert es :)

so hier zur Endkontrolle der komplette Code
jetzt werden auch mehrspaltige Bereiche abgeabeitet und eventuelle leere Zellen übersprungen.

Code: Alles auswählen

FUNCTION EXTRACTIF(LongText as String, sRname as string)
' diese Funktion ermittelt ob ein Begriff aus einem benannten Bereich "sRname" 
' im LongText String enthalten ist und gibt den Begriff ggf. aus, Leezellen werden ignoriert  
sRange = ThisComponent.NamedRanges.getByName(sRname).ReferredCells
oSheet = ThisComponent.NamedRanges.getByName(sRname).ReferredCells.Spreadsheet
iScol = sRange.RangeAddress.StartColumn
iSrow = sRange.RangeAddress.StartRow
	for ic=0 to sRange.Columns.count
		for ir=0 to sRange.Rows.count -1
			sCheck = oSheet.GetCellByPosition(iScol+ic,iSrow+ir).string
			if inStr(LongText,sCheck) > 0 and sCheck <> "" then
			EXTRACTIF = oSheet.GetCellByPosition(iScol+ic,iSrow+ir).string
			exit function
			end if
		next
	next
	EXTRACTIF = "~"
End FUNCTION
habe fertig
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten