関数アクセス 
Calc で使用することのできる関数は Calc 上でなくても使用することができます。
サービス 
関数を使用するには com.sun.star.sheet.FunctionAccess サービスを使用します。
Sub FunctionAccess_1
Dim oFunctionAccess As Object, oProcessServiceManager As Object
oFunctionAccess = CreateUnoService("com.sun.star.sheet.FunctionAccess")
End Sub
関数の呼び出し 
関数を呼び出すには, callFunction メソッドを使用します。
Sub FunctionAccess_2
Dim oFunctionAccess As Object
Dim aArgs(0) As Variant
Dim aResult As Variant
Dim sFunction As String
oFunctionAccess = CreateUnoService( _
"com.sun.star.sheet.FunctionAccess" )
sFunction = "ARABIC"
aArgs(0) = "mxiv"
aResult = oFunctionAccess.callFunction( sFunction, aArgs() ) '--
MsgBox aResult ' 1014
End Sub
"ARABIC" 関数を呼び出した結果, OpenOffice.org Calc の関数リストに例があるように "1014" と表示されます。
callFunction メソッドの最初の引数は,呼び出す関数名です。二番めの引数は,関数が取る引数です。引数を配列として順に渡します。
別の関数も使用してみます。次の関数 "SLOPE" は,XY の範囲の直線の傾きを求める関数です。この関数は,引数として Y と X の値を持つセル範囲をとります。
Sub FunctionAccess_3
Dim oFunctionAccess As Object
Dim aArgs(1) As Variant
Dim aResult As Variant
Dim sFunction As String
Dim oSheet As Object
Dim oXRange As Object, oYRange As Object
oSheet = ThisComponent.getSheets().getByName( "Sheet1" )
oYRange = oSheet.getCellRangeByName( "B4:B15" )
oXRange = oSheet.getCellRangeByName( "A4:A15" )
oFunctionAccess = CreateUnoService( _
"com.sun.star.sheet.FunctionAccess" )
sFunction = "SLOPE"
aArgs(0) = oYRange
aArgs(1) = oXRange
aResult = oFunctionAccess.callFunction( sFunction, aArgs() )
MsgBox aResult '
End Sub
シート内でこの関数を使用する際には "SLOPE(B4:B15;A4:A15)" のように範囲を指定しますが,callFunction メソッドで使用する際には,範囲の引数は com.sun.star.table.XCellRange で指定します。
その他の種類の引数 
IDL リファレンスを参照すると、引数は long、double、long[][]、double[][]、string[][]、any[][]、css.table.XCellRange の型で指定できます。
シートの範囲を指定したくないときや、シートが実在しないときには次のようにします。
Dim vals(1, 1) As Long
vals(0, 0) = 10
vals(0, 1) = 1
vals(1, 0) = 3
vals(1, 1) = 2
sFunction = "MIN"
aArgs(0) = vals
aResult = oFunctionAccess.callFunction( sFunction, aArgs() )
MsgBox aResult '
まとめ 
methods |
SbxEMPTY callFunction ( [in]string aName, [in]seq<any> aArguments ) | Calc の aName 関数を呼び出します。関数の引数は aArguments に指定します。 |
呼び出す関数のセル範囲などの引数は com.sun.star.table.XCellRange で指定します。
引数の数 
引数の数はシートの列数が上限になっています。しかし、シート関数は複数列のセル範囲を引数にとることが出来るので、リファレンスにもあるように、次のようにして列数を超える引数を指定できます。
Sub FunctionAccessWithLargeArray
Dim b(253) As Double
Dim c(253) As Double
For i = 0 to 253 step 1
b(i) = i
c(i) = i + 254
Next
a = Array(b, c)
oFa = CreateUnoService("com.sun.star.sheet.FunctionAccess")
r = oFa.callFunction("MAX", Array(a))
msgbox r
End Sub
その他 
Sub FunctionAccess_4
Dim oFunctionAccess As Object
Dim aArgs(2) As Variant
Dim aResult As Variant
Dim sFunction As String
oFunctionAccess = CreateUnoService( _
"com.sun.star.sheet.FunctionAccess" )
sFunction = "SEARCH"
aArgs(0) = "a.a" 'It is possible to use regular expression.
aArgs(1) = "abrakadabura"
aArgs(2) = 1
aResult = oFunctionAccess.callFunction( sFunction, aArgs() )
MsgBox aResult '
End Sub
Function FunctionResult( sFuncName As String, aArgs() As Variant ) As Variant
Dim oFunctionAccess As Object
oFunctionAccess = CreateUnoService( _
"com.sun.star.sheet.FunctionAccess" )
FunctionResult = oFunctionAccess.callFunction( _
sFuncName, aArgs() )
End Function