Conditional Formatting

Автор Al_Ex, 15 мая 2017, 17:14

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

Al_Ex

Всем привет!

У меня в макросе VBA есть такой кусок кода:

Sub ConditionFormatPassFail()
    With Range("F19:F1048576").FormatConditions.Add(xlCellValue, xlEqual, "Pass")
        .Interior.Color = RGB(198, 239, 206)
        .Font.Color = RGB(0, 97, 0)
    End With
End Sub


Пытаюсь переписать на Python и не нахожу аналога работы с FormatConditions. Уже почти час ищу решение, но кроме использования функции STYLE через интерфейс, ничего интересного не находится, хотя такие вопросы возникают не только у меня.
Кто-то сталкивался с таким и как можно это решить?

rami

Цитата: Al_Ex от 15 мая 2017, 15:14Пытаюсь переписать на Python и не нахожу аналога работы с FormatConditions.
Аналог на StarBasic можно посмотреть в теме в примере от JohnSUN.

Al_Ex

Все равно не могу найти красивое решение...

Решил все же не переписывать код на Python, а использовать макрос, созданный в Экселе, но "подогнанный" под Либру. В общем то все заработало, кроме Conditional Formatting.

Как я понимаю, в Либре программно нет возможности из макроса влиять на эти настройки, как это делает Эксель?

Ладно, решил пойти "простым" путем.
Задал настройки в шаблоне макроса в Экселе.
https://monosnap.com/file/RL8gWqHczMz6c0LE2DkpJwey3ig4CT#

Открыв этот шаблон в Либре видно, что настройки немного изменились. Они "схлопнулись" по условию и изменился диапазон - вместо абсолютного значения всей колонки теперь видно числовые значения с первой до последней. Пока тоже устраивает.
https://monosnap.com/file/CO4OkxarN3eCoQ0VsMnpVO1WinbjVy#

Но вот после того, как макрос отработал, начинается непонятное
https://monosnap.com/file/YZyPnIHPCy0tBweJsgtHf5fi8lNx9P#

Предыдущее условие по колонке F удалено и заменилось на блоки, притом отсутствуют именно те строки, добавленные макросом, по которым должно сработать форматирование. Здесь проблема с коде макроса или в приколы Либры?

"Костыльное" решение - в первом условии поменял руками диапазон F1:F100500.

Но т.к. с файлом будет работать не один человек, то можно это забыть сделать.
Хотелось бы все же как-то один раз сделать такую настройку.
Написать отдельную процедуру можно, но файл будет правиться после выполнения макроса и нужно будет еще раз выполнять эту процедуру по форматированию. И после каждой правки файла опять выполнять...

Что можете посоветовать?

Al_Ex

Оказывается, таки можно влиять на форматтинг. Жаль, что никто не подсказал. В общем подсмотрел решение на другом форуме, что типа такого:


Sub AddConditionalFormatting()
   Call ConditionalFormatting("F1:F1048576", com.sun.star.sheet.ConditionOperator.EQUAL, """PASS""", "ConditionalStyle_3")
   Call ConditionalFormatting("F1:F1048576", com.sun.star.sheet.ConditionOperator.EQUAL, """FAIL""", "ConditionalStyle_4")
End Sub

Sub ConditionalFormatting(strRangeForConditional, strConditionalOperator, strConditionalValue, strConditionalStyle)
   Dim oSheets As Variant
   Dim oObj1 As Variant
   Dim oCellRangeByName As Variant
   Dim oConditionalFormat As Variant
   Dim oNewCondition(3) As New com.sun.star.beans.PropertyValue
   
   oSheets = ThisComponent.getSheets()
   oObj1 = oSheets.getByIndex(0)
   
   oRange = oObj1.getCellRangeByName(strRangeForConditional)
   oConditionalFormat = oRange.ConditionalFormat
   
   oNewCondition(0).Name = "Operator"
   oNewCondition(0).Value = strConditionalOperator
   oNewCondition(1).Name = "Formula1"
   oNewCondition(1).Value = strConditionalValue
   oNewCondition(2).Name = "StyleName"
   oNewCondition(2).Value = strConditionalStyle
   
   oConditionalFormat.addNew (oNewCondition())
   oRange.setPropertyValue("ConditionalFormat", oConditionalFormat)
   
End Sub