Seite 1 von 1

eigene Funktion in Datei gespeichert

Verfasst: Fr, 03.07.2015 06:41
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 ?

Re: eigene Funktion in Datei gespeichert

Verfasst: Fr, 03.07.2015 08:51
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) 88-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

Re: eigene Funktion in Datei gespeichert

Verfasst: Fr, 03.07.2015 09:14
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

Re: eigene Funktion in Datei gespeichert

Verfasst: Fr, 03.07.2015 09:22
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

Re: eigene Funktion in Datei gespeichert

Verfasst: Fr, 03.07.2015 09:30
von Karolus
Ich schrieb WENNFEHLER (LO)
Die Funktion gibts nur in Libreoffice

Ich hab oben noch eine Variante ohne WENNFEHLER hinzugefügt.

Re: eigene Funktion in Datei gespeichert

Verfasst: Fr, 03.07.2015 09:31
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?

Re: eigene Funktion in Datei gespeichert

Verfasst: Sa, 04.07.2015 07:20
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

Re: eigene Funktion in Datei gespeichert

Verfasst: Sa, 04.07.2015 08:48
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 ???

Re: eigene Funktion in Datei gespeichert

Verfasst: Sa, 04.07.2015 10:33
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

Re: eigene Funktion in Datei gespeichert

Verfasst: Sa, 04.07.2015 10:38
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

Re: eigene Funktion in Datei gespeichert

Verfasst: Sa, 04.07.2015 14:18
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