Вычисление формулы в макросе

Автор Narrnika, 30 января 2023, 15:00

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

Narrnika

Добрый день, уважаемые.
Подскажите, плз, можно ли вычислить формулу (введена в виде строки в текстовое поле), не записывая её в ячейку таблицы Calc?
Сейчас приходится делать как-то так:
...
cacheSheet = thisComponent.sheets.getByName("cache")
cell = cacheSheet.getCellByPosition(0, 0)

cell.FormulaLocal = dialog.getControl("fldFormula").getText()
result = cell.getValue()
...
Но, сдаётся мне, это не совсем правильно, хотелось бы остаться в рамках макроса.
Ubuntu 20.04 / LibreOffice 6.4.7.2 / OpenOffice 4.1.7

sokol92

#1
Мне тоже очень не хватает реализации в Calc аналога метода Worksheet.Evaluate (Application.Evaluate) в Excel.

Кстати, при Option VBASupport 1 методы Worksheet.Evaluate и Application.Evaluate в Calc умеют показывать значения ячеек, но, к сожалению, автор кода остановился на самом интересном месте.  :)

Для справки: документация по указанному методу в Microsoft Excel далека от совершенства.
На самом деле, этот метод вычисляет любые формулы Excel. Метод не локализован. Кроме того, в документации ошибочно указано, что метод использует стиль ссылок A1, когда, на самом деле, используется текущий метод ссылок.
Владимир.

Narrnika

Цитата: sokol92 от 30 января 2023, 15:54Мне тоже очень не хватает реализации в Calc аналога метода Worksheet.Evaluate (Application.Evaluate) в Excel.

На самом деле полноценные формулы со ссылками для меня даже избыточны - просто лень парсить строку на простейшую арифметику, думал обойтись встроенным функционалом. Что-нибудь вроде
trigVariable = Evaluate("SIN(45)") из приведённой документации было бы прям самое то. Ну, нет - так нет. Пока поработает через ячейку, может потом что-нибудь придумаю.
Ubuntu 20.04 / LibreOffice 6.4.7.2 / OpenOffice 4.1.7

rami

#3
Цитата: Narrnika от 30 января 2023, 16:33Что-нибудь вроде
Код Выделить Развернуть
trigVariable = Evaluate("SIN(45)")

"Что-нибудь вроде" синуса и косинуса делается так:
Sub Main
Dim angle        'угол в градусах
Dim trigVariable
angle = 45
trigVariable = sin(pi * angle / 180) 'функции sin(), cos() и tan() принимают углы в радианах, pi = 3.14159265358979
Print(trigVariable)
End Sub

Narrnika

Цитата: rami от 30 января 2023, 20:33"Что-нибудь вроде" синуса и косинуса делается так:
Ну, это-то я найти в состоянии ;D
Акцент был не на синусе, а на том, что он в виде строки. Очень удобно, знаете ли, при переносе с бумаги в файл не тянуться за калькулятором, а просто писать в ячейке "=17,3+25+25+25-5,1". Хотелось бы это же удобство при работе с диалогами.
Ubuntu 20.04 / LibreOffice 6.4.7.2 / OpenOffice 4.1.7