Benutzerdefinierte Funktion

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Benutzerdefinierte Funktion

Re: Benutzerdefinierte Funktion

von Thomas Mc Kie » Do, 12.12.2013 15:03

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) 119-mal heruntergeladen

Re: Benutzerdefinierte Funktion

von Stephan » Do, 12.12.2013 12:52

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

Re: Benutzerdefinierte Funktion

von Thomas Mc Kie » Do, 12.12.2013 12:49

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

Re: Benutzerdefinierte Funktion

von Karolus » Do, 12.12.2013 12:34

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

Benutzerdefinierte Funktion

von Thomas Mc Kie » Do, 12.12.2013 12:16

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) 70-mal heruntergeladen

Nach oben