Benutzerdefinierte Funktion

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

Moderator: Moderatoren

Thomas Mc Kie
******
Beiträge: 921
Registriert: Mo, 12.04.2010 00:37

Benutzerdefinierte Funktion

Beitrag von Thomas Mc Kie »

Hallo,

aufgrund der Frage eines anderen Nutzers (viewtopic.php?f=2&t=62938) versuche ich grad recht erfolglos eine Zelladresse in einer benutzerdefinierten Funktion { =HINTERGRUNDFARBE(E9) }zu verwenden.

Leider wird immer der Zellwert verwendet, ich würde aber gerne in der Funktion die Zelladresse variabel haben.

Code: Alles auswählen

Function Hintergrundfarbe(Zelle) As Longint
	dim oCalc as Object
	dim oSheet as Object
	dim oCell as Object
	
REM	Zelle="E9"
msgbox(Zelle)
    ocalc = thiscomponent
    osheet = ocalc.sheets(0)
    ocell = osheet.getCellRangeByName(Zelle)
REM    msgbox ocell.CellBackColor     
	Hintergrundfarbe=ocell.CellBackColor

 End Function
So funktioniert es, wenn ich die Funktion manuell starte (F5):

Code: Alles auswählen

Function Hintergrundfarbe() As Longint
	dim oCalc as Object
	dim oSheet as Object
	dim oCell as Object
	
Zelle="E9"
msgbox(Zelle)
    ocalc = thiscomponent
    osheet = ocalc.sheets(0)
    ocell = osheet.getCellRangeByName(Zelle)
    msgbox ocell.CellBackColor     
REM	Hintergrundfarbe=ocell.CellBackColor
	
 End Function
Dann gibt er mir den Farbwert in einer Messagebox aus.

Kann mir wer weiterhelfen, wie ich die Adresszuweisung richtig hinbekomme?
Und wo ist der Unterschied zwischen der msgbox und der Zuweisung zum Funktionswert, oder ist der Rückgabetyp Lonint für die Funktion falsch (ich hatte gelesen, dass die Hintergrundfarbe als LongInt vorliegt)?

Grüße

Thomas
Dateianhänge
farbe.ods
(10.11 KiB) 69-mal heruntergeladen
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Benutzerdefinierte Funktion

Beitrag von Karolus »

Hallo
Eine UDF die aus Calc in der Form =myFunction(A1) aufgerufen werden soll, reicht nur den puren Inhalt der Zelle A1 an die Funktion weiter, das ist nicht das vollständige Zellobjekt und hat dann auch keinerlei Attribute auf die man in der Funktion zugreifen könnte.

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Thomas Mc Kie
******
Beiträge: 921
Registriert: Mo, 12.04.2010 00:37

Re: Benutzerdefinierte Funktion

Beitrag von Thomas Mc Kie »

Das ist natürlich für die Lösung des Problems schlecht. Aber danke für die Info.

Kann ich mir irgendwie den Quelltext zu vorhandenen Formeln anschauen (z.B: Zelle() )? Ich nehme mal an dass die nicht in Basic geschrieben sind, aber vielleicht hilft es trotzdem.

Grüße

Thomas
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Benutzerdefinierte Funktion

Beitrag von Stephan »

Kann mir wer weiterhelfen, wie ich die Adresszuweisung richtig hinbekomme?
den Bezug auf das Zellobjekt musst Du in DEiner eigenen Funktion selbst herstellen, analog zu dem was Du hiier beschreits gepostet hast:

Code: Alles auswählen

ocalc = thiscomponent
osheet = ocalc.sheets(0)
ocell = osheet.getCellRangeByName(Zelle)
Die nötigen Adressangaben gewinnt Du variabel durch die Nuzun der Funktion Zelle() im Parameter, z.B.:

=HINTERGRUNDFARBE(ZELLE("ADRESSE"))

übergibt jeweils den (absoluten) Zellnamen als String, der Zelle in der der Funktionsaufruf steht. Tabellenbezeichnung lässt sich analog gewinnen, schau Dir die zulässigen Parameter für ZELLE() an.


Gruß
Stephan
Thomas Mc Kie
******
Beiträge: 921
Registriert: Mo, 12.04.2010 00:37

Re: Benutzerdefinierte Funktion

Beitrag von Thomas Mc Kie »

Hallo Stefan,

danke für den Anschubser, ich hatte mir ja sogar Zelle() vorher selbst angesehen, aber auf die Idee, diese Funktion verschachtelt in meiner anzuwenden, bin ich aber dann dummerweise doch nicht gekommen.

So, was ich programmieren wollte, hab ich fertig, mal schauen ob damit geholfen ist.

Hier zur Info der Quellcode und die Datei angehängt:

Code: Alles auswählen

 Function Hintergrundfarbe(Zelle)
REM Aufruf mit =HINTERGRUNDFARBE(ZELLE("ADRESSE";E9)); E9 durch beliebige Zelle austauschbar
REM Funktion gibt Hintergrundfarbe als Wert zurück


	dim oCalc as Object
	dim oSheet as Object
	dim oCell as Object

	anderes_Blatt=false	

    ocalc = thiscomponent
	REM msgbox(Zelle)
	Laenge = Len(Zelle)

	For I = 1 To Laenge
		Punkt = Mid(Zelle,I,1)

		Select Case Punkt
		Case "."
			anderes_Blatt=true
			Trenner=I
REM			MSGBox "anderes Blatt=true"
		End Select
	Next I
	
	if anderes_Blatt=false then	REM Fallunterscheidung Zelle verweist auf dieses Tabellenblatt
		Sheetname= ocalc.currentcontroller.activesheet.name
		Zelladresse=Zelle
	else					REM Fallunterscheidung Zelle verweist auf anderes Tabellenblatt
		Sheetname= LEFT(Zelle, Trenner-1) REM gibt Zeichen bis zum Punkt zurück, also Blattname, aber mit $
		Sheetname= Right(Sheetname, Len(Sheetname)-1) REM gibt Blattname ohne $ zurück
		if Left(Sheetname,1)="'" then
			Sheetname= Mid(Sheetname, 2, Len(Sheetname)-2) REM Schneidet "'" vorne und hinten ab
		end if
REM 	msgbox sheetname
		Zelladresse=Right(Zelle, Laenge-Trenner) REM gibt Zeichen ab Punkt zurück, also Zellname
REM	    osheet = ocalc.Sheets(Sheetname)
REM		ocell = osheet.getCellRangeByName(Zelladresse)
	end if
REM 	MSGbox Sheetname
	    osheet = ocalc.Sheets().getByName(Sheetname)
REM	    MSGBox osheet.name
	    ocell = osheet.getCellRangeByName(Zelladresse)

REM 	msgbox ocell.string
REM		msgbox ocell.CellBackColor
		Hintergrundfarbe=ocell.CellBackColor
	
 End Function
Dateianhänge
farbe.ods
Makro Hintergrundfarbe als Benutzerdefinierte Funktion in Datei enthalten
(13.72 KiB) 118-mal heruntergeladen
Antworten