Суммирование значений в отдельной строке с сохранением первоначального вида

Автор sokol19, 29 марта 2017, 17:51

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

sokol19

Добрый день!
описание скрина: слева вводится произвольный математический пример, а в правой части нужно чтобы выводился ответ на этот пример.
Подскажите, пожалуйста, какую нужно ввести формулу в C1, чтобы ответ выводился автоматом.
Спасибо.

JohnSUN

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

kompilainenn

Джон, файл через пару лет удалят и будем вспоминать, что там в нем было. Продублируй плиз формулу в текст поста. Спасибо
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

rami

Цитата: kompilainenn от 29 марта 2017, 20:47
Джон, файл через пару лет удалят и будем вспоминать, что там в нем было. Продублируй плиз формулу в текст поста. Спасибо
Это волшебная формула, для открепления её от файла нужно знать заклинание ;D

JohnSUN

Тема старая, способ очень старый. Если верить этому сообщению, то решена была пять - почти шесть - лет назад. Ну, в смысле, помечена как [Решено]. На самом деле решение неудовлетворительное.

Сама формула записывается как
=EVALUATE(<адрес ячейки с формулой в виде строки>;RAND())
А EVALUATE это вот такая функция:
Function evaluate(sourceRange As String) As Variant
Dim oSheets As Variant
Dim oSheet As Variant
Dim oWorkSheet As Variant
Dim sString As String
Dim oCell As Variant
Dim nValue As Double
evaluate = ""
On Error GoTo NothingToDo
oSheets = ThisComponent.getSheets()
oSheet = oSheets.getByIndex(1)
sString = Trim(oSheet.getCellRangeByName(sourceRange).getCellByPosition(0, 0).getString())
If sString = "" Then Exit Function
If Left(sString,1) <> "=" Then sString = "=" & sString
oWorkSheet = oSheets.getByIndex(0)

oCell = oWorkSheet.getCellRangeByName(sourceRange).getCellByPosition(0, 0)
oCell.setFormula(sString)
ThisComponent.calculate()
evaluate = oCell.getValue()
NothingToDo:
End Function
Просто берется строка из указанной ячейки, при необходимости дополняется знаком "=" слева и записывается как формула в ячейку с таким же адресом, но на соседнем, скрытом листе. Calc вычисляет результат, макрос считывает то, что получилось, и возвращает как результат функции.
Второй параметр Rand() просто даёт пинка этой функции, чтобы пересчитывалась при каждом изменении на листе.
Почему вычисление приходиться делать на соседнем листе? Потому что на время вычисления значения формулы текущий лист блокируется. Почему адрес ячейки текстовый? Потому что в противном случае пришлось бы использовать только одну ячейку на соседнем листе (например, A1). То есть, если на текущем листе будет несколько ячеек с =EVALUATE(...), то начнется путаница в значениях. А так для каждой "текстовой формулы" используется своя (соответствующая) ячейка на скрытом листе.
И наконец главный вопрос - почему это решение неудовлетворительное?
Потому что скрытый лист один, а листов с формулами может быть несколько. Потому что для вычислений используется книга с данными, в которой макрос без ведома пользователя что-то меняет. Потому что вместо встроенных механизмов офиса используется грязный хак...
Цитата: rami от 29 марта 2017, 21:45
Это волшебная формула, для открепления её от файла нужно знать заклинание ;D
...а заклинание звучит так
However neither Calc nor any spreadsheet I'm familiar with has implemented an EVAL function.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

sokol19

Спасибо, что откликнулись и помогли с решением проблемы, жаль, что нет простой формулы и приходится использовать макрос, но в любом случае - Вы очень помогли. Спасибо :)

economist

В #4 вполне нормальное решение, поскольку уровень задачи - "учебно-познавательный".

Для более серьезной, частой и полезной задачи - отображать сам текст формулы из С3 в A1 - есть специальная формула =ФОРМУЛА(С3), извиняюсь за тавтологию. Она позволяет показать ход простых вычислений.

К сожалению, гораздо более важные в жизни формулы вида =VLOOKUP()/=ВПР(), без которых пользователь Calc считается безграмотным, таким образом визуализировать бесполезно, т.к. лучшая практика - это многократное ручное написание формулы, чтобы запомнить на века "эти три аргумента".    

А так для решения подобных задач есть "формульные" калькуляторы. Там можно вводить значки интегралов, делать многоэтажные дроби, как в учебниках - и о чудо, они будут рассчитаны. Несколько мобильных приложений умеют распознавать их со снимка камеры, буквально вчера поймал чудика на экзамене за этим занятием, он не мог посчитать объем усеченного конуса, зная формулу расчета обычного. Да, люди с высшим образованием не умеют пользоваться кнопкой M+ на калькуляторе.  

И еще есть команда Calc: Вид-Показать формулу, которая циклически меняет формулу и ее значение местами (можно назначить Ctrl+~, будет как в MS Excel).
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...