Форматирование с помощью UDF

Автор testuser, 29 декабря 2022, 17:42

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

testuser

Всем привет!
Дублирую тему с другого форума. Хотел был обратить внимание на обстоятельство - в LO можно редактировать ячейки с помощью UDF, и даже менять их формат и все было бы классно.. В приведенном примере UDF меняют цвет ячеек, как задумано, но только один раз, при открытии файла. При дальнейших изменениях цве уже не изменяется, хотя функции пересчитываются..
Function Test1(sh&, rw&, cl&)
    With ThisComponent.Sheets(sh-1).GetCellByPosition(cl-2, rw-1)       
        Select Case .getValue()
            Case 1 to 3: .CellBackColor = RGB(0, 0, 255)
            Case 4 to 7: .CellBackColor = RGB(0, 255, 0)
            Case Else: .CellBackColor = RGB(255, 0, 0)
        End Select
    Test1 = .value
    End With
end function

mikekaganski

Цитата: testuser от 29 декабря 2022, 17:42Хотел был обратить внимание на обстоятельство - в LO можно редактировать ячейки с помощью UDF

На самом деле нельзя. UDF не должны менять документ, они должны только вычислять и возвращать значение.
См. https://ask.libreoffice.org/t/can-a-function-write-data-into-a-function-selected-cell/24597/2.

Несмотря на то, что там обсуждается возможность "сбить с толку" вычислитель, в принципе в программе не предусмотрены такие побочные эффекты UDF, и поэтому любое странное поведение в этом случае - ошибка создателя UDF.
С уважением,
Михаил Каганский

sokol92

Здесь Microsoft указывает и объясняет ограничения на UDF-функции в Excel. Возможно, аналогии в данном случае уместны.
Владимир.

testuser

Все это понятно, своеобразная "защита от дурака". Но формат то зачем запрещать, он же не влияет на результаты вычислений? Хотя есть один аргумент. Из моих наблюдений за Excel - UDF - не лучший способ вычислений, поскольку минимальное время выполнения одной UDF ограничено временем обращения к объекту типа "range". Гипотетически каждая функция совершающая редактирвание может также добавлять время доступа к объекту редактирования (вероятнее всего отдельной ячейке), что может быть также не оптимально. В Calc аргументы автоматически не передаются как объекты и нет встроенного объекта Application.Calc, и тем и интересен такой подход, что может быть в Calc нет вышеописанного ограничения, надо проверять.