Seite 2 von 2

Re: Funtions Parameter als Object

Verfasst: Di, 26.05.2015 11:17
von Karolus
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

Verfasst: Di, 26.05.2015 11:32
von clag
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

Verfasst: Di, 26.05.2015 13:01
von balu
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

Verfasst: Di, 26.05.2015 13:40
von clag
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

Verfasst: Di, 26.05.2015 15:01
von mikeleb
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

Verfasst: Di, 26.05.2015 15:18
von clag
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: Funktions Parameter als Object

Verfasst: Di, 26.05.2015 15:58
von mikeleb
Hallo clag,

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