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:
oder
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.
