Co zrobić, jeśli funkcja jest dostępna w arkuszu, ale nie jest dostępna w makrach?

Z Henryk Dąbrowski
Skocz do: nawigacja, szukaj
11.07.2020



Wiele funkcji jest dostępnych w arkuszu (np. LOG10() lub EASTERSUNDAY() - w polskiej wersji WIELKANOC()), ale nie są dostępne w makrach. Wywołanie takich funkcji jest możliwe, ale jest bardziej skomplikowane. Przykładowo:

Function myLog10(x as Double) as Double
    'oblicza logarytm o podstawie 10
    Dim oFuncAcc as Object
    oFuncAcc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
    myLog10 = oFuncAcc.callFunction( "LOG10", Array(x) )
    'UWAGA: funkcja Array() tworzy tablicę, w której przekazujemy wszystkie potrzebne parametry
End Function
Sub Test1()
    MsgBox myLog10(100)
    MsgBox LOG10(100)
End Sub


Podobnie mamy:

Function myWielkanoc(Yr as Long) as Date
    'oblicza datę Wielkanocy dla danego roku
    Dim oFuncAcc as Object
    oFuncAcc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
    myWielkanoc = oFuncAcc.callFunction( "EASTERSUNDAY", Array(Yr) )
    'UWAGA: funkcja Array() tworzy tablicę, w której przekazujemy wszystkie potrzebne parametry
End Function
Sub Test2()
    MsgBox myWielkanoc(2000)
    MsgBox EASTERSUNDAY(2000)
End Sub


Oczywiście jeśli nie przewidujemy wielokrotnego używania takiej funkcji, to możemy powyższą konstrukcję umieścić wprost w procedurze, w której akurat z danej funkcji potrzebujemy skorzystać:

Sub Suma()
    'procedura sumuje wszystkie liczby z komórek w zakresie od A1 do Z16
    Dim oSht as Object, oRng as Object, oCell as Object
    Dim oFuncAcc as Object
    oSht = ThisComponent.getSheets.getByIndex(0) 'uchwyt do pierwszego arkusza
    oRng = oSht.getCellRangeByPosition(0, 0, 25, 15) 'od komórki A1 do Z16
    oCell = oSht.getCellByPosition(0, 16) 'komórka A17
    oFuncAcc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
    oCell.Value = oFuncAcc.callFunction( "SUM", Array(oRng.Data) )
End Sub





LibreOffice Calc – makra                   Strona główna