Seite 1 von 1

Macroverwaltung für eine nutzerdefinierte Funktion

Verfasst: Do 19. Mär 2015, 09:15
von Wanderer
Hallo,

nach dem Upgrade auf LO 4.3.5.2 (von einer 4.1-Version) habe ich die verschiedensten Dataien durchgetestet, die ich so auf meinem Rechner habe, und
ein Problem in der Makroverwaltung entdeckt.

Die angehängte Datei FarbTest3 funktioniert, so wie ich sie hochgeladen habe, problemlos und enthält
eine benutzerdefinierte Funktion (stammt auch aus den Foren). Wobei der eigentliche Makro meiner Ansicht nach wohl nicht relevant ist.

Wenn die Funktion nicht in der Datei gespeichert ist, (wie in der hochgeladenen Version),
sondern nur unter "Meine Macros"->Standard-Module1 zu finden ist kommt es beim Laden zu einem (bzw. 3) Fehlern.
Wenn ich die Fehlermeldungen jeweils mit OK bestätige, wird die Datei geladen, aber der Makro offensichtlich nicht richtig ausgeführt.
Wenn ich jetzt Shift-Ctrl-F9 drücke wird die Datei ohne Fehlermeldung neu berechnet.
In meiner ursprünglichen Version musste ich 9-mal OK bestätigen, d.h. für jeden Aufruf von FARBE einmal. Ich hab dann 6 Felder gelöscht.

Unter meiner vorherigen LO Version 4.1.3.2 konnte ich auch die Version ohne Macro in der Datei (nur unter Meine Macros) problemlos laden.

Meine Fragen wären nun: Ist das ein Bug der beim Laden der Datei auftritt, oder nur irgendein neues Konzept, daß ich nicht verstehe?
Gibt es neben dem Workaround "Makro in der Datei enthalten" eine Anpassung im Macro.

Zum Ausprobieren müsstet Ihr den Makro natürlich einmal selbst in Eure Library verschieben und in Farbe3 löschen,
oder das mit einer eigenen Funktion nachvollziehen. Eine Testdatei kann ich da natürlich nicht beilegen.

MfG, Jörn

PS: Code der Funktion, falls es doch etwas damit zu tun hat:

Code: Alles auswählen

Function FARBE(Zellname As String, R, G, B, Optional Tabellenname As String)
If IsMissing(Tabellenname) then 
oDoc = StarDesktop.ActiveFrame.Controller.Model
Tabellenname = oDoc.CurrentController.getActiveSheet().Name
End if
zelle = ThisComponent.Sheets().getByName(Tabellenname).getCellRangeByName(Zellname) 
If zelle.CellBackColor(R,G,B)=RGB(R,G,B) Then 
      FARBE=1 
   else 
      FARBE=0 
End if 
End Function

Re: Macroverwaltung für eine nutzerdefinierte Funktion

Verfasst: Do 19. Mär 2015, 18:10
von mikele
Hallo,

es liegt am Namen der Funktion. Ich habe sie mal testweise umbenannt und es klappt.
Hintergrund: es gibt neuerdings eine Funktion Farbe(Rot;Grün;Blau;Alpha), zu der ich aber in der Hilfe noch nichts gefunden habe.

Re: Macroverwaltung für eine nutzerdefinierte Funktion

Verfasst: Mi 25. Mär 2015, 08:50
von Wanderer
Hallo Mikele,

Umbenennen hat bei mir keine Änderung gebracht.
Die Fehlermeldung bleibt gleich: Es scheint beim Laden (noch) keine Methode getActiveSheet zu geben, weshalb der Aufruf der Funktion einen Fehler auswirft.
Gibt man den Tabellennamen explizit im optionalen Parameter an wir der Fehler 2 Zeilen weiter ausgeworfen: Sheets() wäre nicht definiert.

Beides ist später kein Problem mehr, weshalb beim Neuberechnen der Tabelle mit Shift-Ctrl-F9 alles funktioniert.
Welche LO-Version hast Du denn ausprobiert?
Nebenbei: Die Namenskollision würde für mich erklären, daß es nie funktioniert, nicht, warum es einen Unterschied macht, wo meine Funktion gespeichert ist.

MfG, Jörn

Re: Macroverwaltung für eine nutzerdefinierte Funktion

Verfasst: Fr 27. Mär 2015, 17:12
von mikele
Hallo,

du hast Recht. Beim Start der Datei scheint Thiscomponent nicht belegt zu sein und damit kommt es zur Fehlermeldung Sheets() nicht definiert.
Die erste Fehlermeldung erscheint bei mir nicht.
Allerdings habe ich das Problem mit der bereits anderweitig definierten Funktion Farbe(), weswegen ich im Tabellenblatt den Fehler #Wert erhalte.
Mit folgendem Makro in Meine Makros funktioniert es fehlerfrei (auch beim ersten Aufruf der Datei):

Code: Alles auswählen

Function FARBE_udf(Zellname As String, R, G, B, Optional Tabellenname As String)
	odoc=StarDesktop.ActiveFrame.Controller.Model
	If IsMissing(Tabellenname) then 
	Tabellenname = oDoc.CurrentController.getActiveSheet().Name
	End if
	zelle = odoc.Sheets().getByName(Tabellenname).getCellRangeByName(Zellname) 
	If zelle.CellBackColor(R,G,B)=RGB(R,G,B) Then 
	      FARBE_udf=1 
	   else 
	      FARBE_udf=0 
	End if 
End Function
Ich habe interessanterweise auch LO 4.3.5.2 im Einsatz (unter Ubuntu 12.04).