Funktions Parameter als Object

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: Funktions Parameter als Object

Re: Funktions Parameter als Object

von mikeleb » Di, 26.05.2015 15:58

Hallo clag,

ich bitte hiermit in aller Form und mit tiefstem Respekt um Entschuldigung für mein brutales Vorgehen. :)

Re: Funtions Parameter als Object

von clag » Di, 26.05.2015 15:18

oh man, mikeleb

jetzt hast du aber mit 5 Zeile BasicCode mein gesamtes BasicSelbstvertrauen förmlich eliminiert.
Mit solchen schockierenden Mitteilungen wie dein alternative Code, musst du behutsamer an das Opfer herantreten.
Und ich hatte geglaubt ich hätte mir was tolles ausgedacht. :(

outsch ;)

Trotzdem besten Dank das du mir die Realität aufzeigst.

Re: Funtions Parameter als Object

von mikeleb » Di, 26.05.2015 15:01

Hallo clag,

hier mal ein Alternativ-Code:

Code: Alles auswählen

Function LUCI(xCol)
   oDoc = ThisComponent
   oSheet = oDoc.Sheets(0)
   ocol=osheet.columns(xCol-1)
   oleer=ocol.queryemptycells
   oleerletzte=oleer.getbyindex(oleer.getcount-1).getcellbyposition(0,0).celladdress.row
   LUCI=oleerletzte
End Function

Re: Funtions Parameter als Object

von clag » Di, 26.05.2015 13:40

Hallo Balu,
balu hat geschrieben:Wo willst Du deine eigene Funktion =LUCI() einsetzen?
wenn möglich wie jede Funktion so flexible wie möglich also eben auch ziehen.

Ich selber hatte die Function mir für ein Makro erstellt.
Danach kam mir die Idee den Cosde auch in eine eine UDF zu packen und etwas universeller zu gestalten.
Die Parameter als SPALTE() und ZEILE() wären so schön einfach gewesen einschließlich Sprachumsetzung,
intern wäre es ja immer column und row.

=LUCI(SPALTE())

Code: Alles auswählen

Function LUCI(xCol)
iCol = xCol-1
	oDoc = ThisComponent
	oSheet = oDoc.Sheets(0)
	iCol = xCol-1
'	sTick = GetSystemTicks()
	aFunc = GetProcessServiceManager().createInstance("com.sun.star.sheet.FunctionAccess") 
	Xs = 1048576 : do : Xe = Xs : Xs = Xe/2
	NRange = oSheet.getCellRangeByPosition(iCol,Xs,iCol,Xe-1)
	Test1 = aFunc.callFunction("COUNTA", Array(NRange)) 
	if xs = 1 then Line = 1 
	if Test1 > 0 then : do
	if Xe-Xs < 4 then 
	for i=Xe to Xs step -1 
	Result = oSheet.getCellByPosition(iCol,i-1)
	if Result.Type <> 0 then Line = i : exit do 
	next : end if
	Xa = Xs : Xb = Xe : Xs = Xs + (Xe-Xs)/2
	NRange = oSheet.getCellRangeByPosition(iCol,Xs,iCol,Xe-1)
	Test2 = aFunc.callFunction("COUNTA", Array(NRange)) 
	if Test2 = 0 then Xb = Xs : Xs=xa : Xe=Xb : Test2 = 1
	loop until Test2 = 0 : end if : loop while isEmpty(Line)
	LUCI=Line
'	eTick = GetSystemTicks()
'	print line, "get in " & eTick-sTick 	
end Function
tschuldigung ist wieder in der von dir wenig geliebten zusammengeschobenen Version und auch z.Z. nur für Spalten
aber für Zeilen braucht man ja nur ein paar Variablen zu ändern.

edit:
hier der Code wieder auseinandergedröselt

Code: Alles auswählen

Function LUCI(xCol)
iCol = xCol-1
	oDoc = ThisComponent
	oSheet = oDoc.Sheets(0)
	iCol = xCol-1
'	sTick = GetSystemTicks()
	aFunc = GetProcessServiceManager().createInstance("com.sun.star.sheet.FunctionAccess") 
	Xs = 1048576 
	do 
	Xe = Xs 
	Xs = Xe/2
	NRange = oSheet.getCellRangeByPosition(iCol,Xs,iCol,Xe-1)
	Test1 = aFunc.callFunction("COUNTA", Array(NRange)) 
	if xs = 1 then Line = 1 
	if Test1 > 0 then 
		do
			if Xe-Xs < 4 then 
				for i=Xe to Xs step -1 
					Result = oSheet.getCellByPosition(iCol,i-1)
					if Result.Type <> 0 then 
						Line = i 
						exit do 
					end if
				next 
			end if
			Xa = Xs 
			Xb = Xe 
			Xs = Xs + (Xe-Xs)/2
			NRange = oSheet.getCellRangeByPosition(iCol,Xs,iCol,Xe-1)
			Test2 = aFunc.callFunction("COUNTA", Array(NRange)) 
			if Test2 = 0 then 
				Xb = Xs 
				Xs=xa 
				Xe=Xb 
				Test2 = 1
			end if
		loop until Test2 = 0 
	end if 
	loop while isEmpty(Line)
	LUCI=Line
'	eTick = GetSystemTicks()
'	print line, "get in " & eTick-sTick 	
end Function

Re: Funtions Parameter als Object

von balu » Di, 26.05.2015 13:01

Hallo clag!

Nachdem sich die Gelehrten (Stephan und Karolus) zu Worte gemeldet haben, möchte ich als Anfänger mich auch noch kurz einklinken.

Als erstes würde mich mal interessieren wie dein Code aussieht um die letzte benutzte Zelle zu ermitteln, egal ob für Zeile oder Spalte.

Und dann noch etwas grundsätzliches.
Wo willst Du deine eigene Funktion =LUCI() einsetzen? In der gleichen Zeile/Spalte wo die letzte benutzte Zelle gesucht werden soll, oder wie stellst Du dir das vor?

Und ferner, warumm soll die Funktion "ziehbar" sein?



Gruß
balu

Re: Funtions Parameter als Object

von clag » Di, 26.05.2015 11:32

Hallo Karolus,

deine Idee hatte ich auch schon angedacht durch Zahl und Text kann man schon gut Zeile Spalte unterscheiden
muß mann eben über ASC den TEXT in Index wandeln, aber ist auch nicht ziehbar.

meine Funktion soll "LUCI()" (LastUsedCellIn) heißen und dann wäre
=LUCI(SPALTE(E12)) oder
=LUCI(ZEILE(E12))

eine schöne eindeutige und immer gültige, ziehbare Adressierung gewesen, ohne irgend etwas anpassen/umrechnen zu müssen,
wenn es denn so funktioniert hätte das man aus dem einen Parameter zwei unterschiedliche Informationen entnehmen könnte.

hmmm ...

Re: Funtions Parameter als Object

von Karolus » Di, 26.05.2015 11:17

Das würde ich mit einer Funktion erledigen, deren Aufruf aus Calc so ausehen würde:

Code: Alles auswählen

=LASTUSED("EX")
oder

Code: Alles auswählen

=LASTUSED(12)
dann kann deine UDF selbst entscheiden ob die letzte benutzte in der Zeile oder in der Spalte zurückgegeben wird.

Re: Funtions Parameter als Object

von Stephan » Di, 26.05.2015 10:57

verwende:

=MEINEFUNKTION("G21")

mit:

Code: Alles auswählen

Function MEINEFUNKTION(x As String)
zellobjekt = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(x)
'.... mache was mit dem zellobjekt
End Function
Das Ganze sieht in der Zelle dann nicht doof aus, hat nur den Nachteil das sich die Formel bei Ziehen/Kopieren eben nicht automatisch anpasst.

Gruß
Stephan

Re: Funtions Parameter als Object

von clag » Di, 26.05.2015 10:50

Hallo Karolus,
Karolus hat geschrieben: Hast du tatsächlich diesen Thread gestartet nur um irgendwie bereits vorhandene Funktionen ( SPALTE, ZEILE ) neu zu erfinden.
nein nen bischen deppert bin ich ja schon aber noch nicht völlig.

ich möchte mit einer Funktion die letzte benutze Zelle ermitteln entweder für Spalte oder Zeile,
darum muss die Funktion irgendwie wissen ob und in welcher Spalte / Zeile gesucht werden soll.

Ihr beide treibt gerade, "wie ein Wiesel das Kaninchen über den Acker" mich durch das Basicgebüsch. ;)

Re: Funtions Parameter als Object

von clag » Di, 26.05.2015 10:40

Hallo Stephan,

unser Beiträge haben sich gerade überschnitten.
Stephan hat geschrieben:... und bitte komme selbst darauf wie Du mit "G21" innerhalb Deiner benutzerdefinierten Funktion auf das Zellobjekt zugreifen kannst ;-)

und ich zeige auch schon mal vorrauseilendes erröten für meine Fragerei
deine Antwort lässt mich ja vermuten das ich mich gerade ziemlich daneben ziele,
aber es klingel irgenwie garnix bei mir, außer mein Tinitus?

gib mir doch bitte noch einen Tip.

Re: Funtions Parameter als Object

von Karolus » Di, 26.05.2015 10:38

Wie soll ich das jetzt verstehen?

Hast du tatsächlich diesen Thread gestartet nur um irgendwie bereits vorhandene Funktionen ( SPALTE, ZEILE ) neu zu erfinden.

Re: Funtions Parameter als Object

von clag » Di, 26.05.2015 10:22

Ha!

na denn bin ich ja wieder bei =MEINEFUNKTION("Spalte"; Spalte(EX)) :roll:

ich glaube es ist einfacher ich werde die Funktion in zwei separate Funktionen aufbrechen
eine nur für Zeile und eine für Spalte, dann brauche ich nur die Zahl.
Na nen Versuch wars trotzdem wert.

Also allerbesten Dank für die Unterstützung.

Re: Funtions Parameter als Object

von Stephan » Di, 26.05.2015 10:17

Ja man könnte den Wert gleich als Zahl eingeben z.B. =MEINEFUNKTION("Spalte"; 154)
aber wer weiß schon aus dem Kopf welche Spalte "EX" ist ?
Was willst Du denn nun überhaupt ... ?

Wenn Du bereit bist Formeln so zu parametieren wie in "=MEINEFUNKTION("Spalte"; 154)", kannst Du genausogut auch "=MEINEFUNKTION("G21")" verwenden (was dann nicht doof aussieht), weil das Ziel meines Beispiels (deshalb auch mit "z.B." gekennzeichnet) doch nur das war einen Vorschlag zu machen bei dem sich beim 'Ziehen' oder Kopieren der Formel der Bezug automatisch anpasst.

Da in "=MEINEFUNKTION("Spalte"; 154)" die 154 beim Ziehen/Kopieren ohnehin statisch ist, ist stattdessen "=MEINEFUNKTION("G21")" dann die bessere Lösung.

... und bitte komme selbst darauf wie Du mit "G21" innerhalb Deiner benutzerdefinierten Funktion auf das Zellobjekt zugreifen kannst ;-)


Gruß
Stephan

Re: Funtions Parameter als Object

von Karolus » Di, 26.05.2015 10:08

Die Funktion =SPALTE(EX1) weiss es...

Re: Funtions Parameter als Object

von clag » Di, 26.05.2015 09:51

Hallo Karolus,

ich hatte es schon befürchte, das dein Kommetar diesmal etwas bissiger ausfällt ;)

Aber wie sage ich es denn meinem Kinde in eleganterer Form, das der Wert als Index einer Spalt oder Zeile anzuwenden ist?
Ja man könnte den Wert gleich als Zahl eingeben z.B. =MEINEFUNKTION("Spalte"; 154)
aber wer weiß schon aus dem Kopf welche Spalte "EX" ist ?

Nach oben