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
Hallo Balu,
[quote="balu"]Wo willst Du deine eigene Funktion =LUCI() einsetzen?[/quote]
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.
[color=#0000FF]=LUCI(SPALTE())[/color]
[code]
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
[/code]
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.
[color=#FF0000]edit:[/color]
hier der Code wieder auseinandergedröselt
[code]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
[/code]