Вычислить функция от диапазона. Как?

Автор dr.Faust, 25 августа 2010, 01:31

0 Пользователи и 1 гость просматривают эту тему.

dr.Faust

Есть диапазон на листе Calc. Как вычислить для него функцию Calc?
Следующий, очевидный подход не пашет:
FuncService = CreateUnoService("com.sun.star.sheet.FunctionAccess")
rsltMAX = FuncService.callFunction("MAX", oRange.getDataArray)
Свобода информации - свобода личности!

Рыбка Рио

Sub Main
oRange = ThisComponent.Sheets(0).getCellRangeByName("A1:A5")
FuncService = CreateUnoService("com.sun.star.sheet.FunctionAccess")
rsltMAX = FuncService.callFunction("MAX", Array(oRange.getDataArray))
msgbox rsltMAX
End Sub
ubuntu 12.04 + LibO3.6.0

convas

Клио:

Не работает.



[вложение удалено Администратором]

dr.Faust

И не будет...
Оно то и в моей постановки не работает. так как аргумент массив массивов.
Перегружать поэлементно?
Свобода информации - свобода личности!

chkur


Рыбка Рио

И у меня работает (на Lin и Win, OOo3.2.1).

ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Цитата: dr.Faust от 25 августа 2010, 10:30так как аргумент массив массивов
Так и должно быть, т.к. вначале вы задаёте имя функции, а затем массив аргументов. У функции MAX  есть только 1 аргумент, поэтому массив состоит из одного элемента.
ubuntu 12.04 + LibO3.6.0


Рыбка Рио

Цитата: convas от 25 августа 2010, 09:23Клио:

Не работает.
Если в диапазоне A1:A5 есть ячейки без чисел, то тоже ошибка появляется точно такая же как у вас, а если там только числа - то всё без ошибок.
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

#9
А вот вариант, который должен работать даже если среди ячеек есть сроковые или пустые (правда, им будут соответствовать нулевые значения, поэтому если вы ищете максимум из отрицательных числе, то получите ноль в случае если есть хоть 1 пустая ячейка).

Sub Main
oRange = ThisComponent.Sheets(0).getCellRangeByName("A1:B5")
FuncService = CreateUnoService("com.sun.star.sheet.FunctionAccess")
ars1= oRange.DataArray
Dim ars5(ubound(ars1())) As Double
For i=lbound(ars1()) to ubound(ars1())
   Redim ars4(ubound(ars1(i))) As Double
   For j=lbound(ars1(i)) to ubound(ars1(i))
      ars4(j)=ars1(i)(j)
   Next
   ars5(i) = FuncService.callFunction("MAX", Array(Array(ars4())))
Next
rsltMAX = FuncService.callFunction("MAX", Array(Array(ars5())))
msgbox rsltMAX
End Sub
ubuntu 12.04 + LibO3.6.0

convas

Да, верно, так все работает.

Еще вопрос. При попытке использовать функцию "CELL" в callFunction:
Sub CellFunc
FuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")
odoc=thiscomponent
oSheet = oDoc.CurrentController.getActiveSheet()
x="ADDRESS"
y="D7"
a=osheet.getcellrangebyname(y)
z = FuncAcc.callFunction("CELL",array(x,a))
MsgBox z
End Sub


всегда результат (z):  $Лист1.$A$1, независимо от значения y?