Calc Автофильтр: баг или не баг?

Автор eeigor, 5 февраля 2022, 17:41

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

eeigor

Много мелочей-недоделок остаётся однако...
Пример.
Используя автофильтр, иногда нет необходимости (и желания тоже) добавлять кнопки раскрывающихся списков на каждое поле, например на такое, где фильтровать что-л. бессмысленно. Кроме того, кнопка автофильтра увеличивает ширину поля, когда места на экране и так мало. Или, к примеру, есть 15 полей, в их числе поле "ФИО", фильтровать нужно только по этому полю. Зачем отображать 15 кнопок?
И LO Calc позволяет выделить диапазон и включить автофильтр, и при этом кнопки появятся в первой строке только выделенного диапазона. Предусмотрено. В MS Excel также.

Вариант 1. Кнопки автофильтра отображаются в каждом поле.
Автофильтр работает как должно и через диалог, и через макросы. При наложении условия через стандартный фильтр диапазон данных фильтруется, кнопка автофильтра подсвечивается, заголовки строк (номера) выделяются синим цветом. В раскрытом автофильтре есть пункт "Clear Filter".
EDIT: При фильтрации вручную надо открыть параметры и установить флажок «Регулярные выражения».


Вариант 2. Кнопки автофильтра отображаются не во всех полях.
В файле-примере выделим два последних поля диапазона данных (кроме первого). Включим автофильтр на два поля.
Через диалог, вроде, всё работает.
Макросы. При этом автофильтр по-прежнему работает... Однако после наложения фильтра кнопка автофильтра не подсвечивается, при раскрытии списка автофильтра в нём таинственным образом исчезает пункт "Clear Filter". Заголовки строк (номера) не выделяются синим цветом.

Если фильтр был наложен через диалог, при этом кнопка автофильтра подсвечивается, то попробуем снять фильтр макросом "Remove Filter". Фильтр будет снят, но кнопка автофильтра останется светящейся, заголовки строк при уже снятом фильтре останутся синими, а в форме стандартного фильтра все параметры и условия останутся не снятыми (не очищенными). Эта ситуация отражена (сохранена) в прилагаемом файле (за тем лишь исключением, что при повторном открытии файла заголовки строк уже не будут синими, но остальное - в силе).

Примечание. Доступ к окну диалога стандартного фильтра осуществлялся через соответствующий пункт в раскрытом автофильтре.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#1
Здравствуйте, Игорь!

Я думаю, что правильной последовательностью действий для выставления автофильтра с помощью макроса является следующая:
- убрать существующий автофильтр, если он есть: ".uno:DataFilterRemoveFilter"
- создать и применить новый автофильтр (как в Вашем макросе)
- сделать автофильтр видимым: ".uno:DataFilterAutoFilter"

Кроме того, вместо TableFilterField лучше использовать более новый TableFilterField2.
Владимир.

eeigor

#2
Владимир, спасибо. Я позже испытаю.
В макросе применяется стандартный фильтр.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Я "по инерции" использую терминологию Excel: фильтр (автофильтр, стандартный фильтр) и расширенный фильтр.
Владимир.

eeigor

#4
Владимир, я поменял на FilterFields2, снял через меню автофильтр, выполнил фильтрацию макросом, выделил два последних столбца диапазона и через меню вернул автофильтр. Кнопка автофильтра осталась не подсвеченной, как должна бы. Другими словами, те две UNO-команды, о которых Вы говорили, я выполнил вручную.

Я обратил внимание на такую деталь. В первом варианте команда в меню Data >> More Filters >> Reset Filter доступана, и фильтр можно снять, а во втором варианте эта команда не доступна, и, как отмечал, исчезает кнопка Clear Filter в окне автофильтра. Фильтр можно снять макросом или дважды нажав на пункт меню Data >> AutoFilter.

EDIT: Обращу внимание ещё на одну деталь. Если кнопки автофильтра отображаются (тут по всем полям таблицы), то наложение фильтра макросом подсвечивает кнопку и выделяет синим цветом заголовки строк. Но если кнопки автофильтра не отображаются, то наложение фильтра макросом не влечёт за собой никакой индикации: кнопки заголовков строк не выделяются.

Я не знаю, как должно быть, просто отмечаю некоторую непоследовательность (или несогласованность) в работе разных функциональных средств.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Почему-то мне кажется, что этот баг не сложно исправить, потому что у нас имеется правильный вариант работы, а отображение не всех кнопок автофильтра видится чем-то не связанным с работой самого фильтра.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#6
Я правильно описал последовательность действий в #1, но рецепт предложил не совсем точный.
На мой взгляд, есть проблема с парадигмой model-view-control (MVC), замечательно описанной в Книге А.Питоньяка.
Установка фильтра (стандартного, автофильтра) относится к модели. Доказательство: некоторые функции Calc "понимают" скрытые фильтром ячейки. А отображение стрелок на листе - это функция контроллера листа.

В Excel есть свойство Worksheet.AutoFilterMode, которое отвечает за показ на листе стрелок для автофильтра. В Calc аналога я не знаю.

Затратив уйму времени, я, кажется, нашел узкую тропинку, ведущую к цели - попробуйте запустить макрос ApplyFilterToField2 из прилагаемой книги.
Суть алгоритма. Мы выделяем первую строку диапазона, далее выдаем команды ".uno:DataFilterAutoFilter" и ".uno:DataFilterHideAutoFilter". Первая команда выставит "стрелочки" автофильтра на выделенные ячейки или уберет их, если на эти ячейки ранее был выставлен фильтр. Вторая команда делает "контрольный выстрел". После этого этапа на листе не должно оставаться стрелок автофильтра (листа).
Далее, выставляем требуемый фильтр (Ваш макрос) и стрелочки (вновь ".uno:DataFilterAutoFilter").

Пробуйте.

Sub ApplyFilterToField2()
  Dim oDisp, oDataRange
  oDisp=createUnoService("com.sun.star.frame.DispatchHelper")
  oFrame=ThisComponent.CurrentController.Frame

  oDataRange =ThisComponent.NamedRanges.getByName(DATA).ReferredCells 
  ThisComponent.CurrentController.Select oDataRange.getCellRangeByPosition(0, 0, oDataRange.Columns.Count-1, 0)
  oDisp.executeDispatch(oFrame, ".uno:DataFilterAutoFilter", "", 0, Array())
  Wait 50
  oDisp.executeDispatch(oFrame, ".uno:DataFilterHideAutoFilter", "", 0, Array())   
  Wait 50
 
  ApplyFilterToField1() 
  ThisComponent.CurrentController.Select oDataRange
  oDisp.executeDispatch(oFrame, ".uno:DataFilterAutoFilter", "", 0, Array()) 
End Sub
Владимир.

eeigor

#7
Владимир, я выполнил макрос, но автофильтр по окончании был включен по всем полям (это вариант 1, когда всё работает).
Далее я выделил только два последних столбца отфильтрованного диапазона данных и выбрал в меню пункт Автофильтр (галочка напротив установлена и после выбора этого пункта останется не снятой). Результат: кнопки будут только на двух крайних полях, и кнопка в поле с наложенным фильтром погаснет (но наложенный фильтр останется): мы вернулись "на круги своя" (вариант 2). Или я что-то сделал не так?

UPD:
У меня 2 бага по Автофильтру. Напишу баг-репорты позднее. А пока работаю с ограничением: параметр "совпадения со всей строкой условия" всегда включен (cсылка); автофильтр включаем (отображаем кнопки) только по всему диапазону данных (это этот пост).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Я забыл добавить вложение. Сейчас при всех обстоятельствах макрос ApplyFilterToField2 должен выставлять требуемый фильтр и фильтр должен корректно отображаться (независимо от наличия/отсутствия предыдущих фильтров листа).
Владимир.

eeigor

#9
Владимир, у меня прежний результат. Состояние после вызова макроса в Вашем файле в моей среде на скриншоте: кнопка автофильтра в первом столбце отображается (как и все остальные), и всё работает как в варианте 1. Проделайте мои шаги в ответе #7.

Но я полностью согласен с Вами: раз в варианте 1 всё работает верно, значит дело исключительно в отображении при работе макроса.

Возможно, надо вызвать UNO-метод FilterExecute, но я не знаю, как это сделать (при записи макроса строка с эти методом будет закомментирована).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Выложите, пожалуйста, документ перед (неудачным) запуском ApplyFilterToField2.
Владимир.

eeigor

Не совсем понял. Я запуксал Ваш файл на своей машине, только макросы вызывал из модуля через Alt+F11.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Вы открыли файл из #6, сразу же выполнили макрос ApplyFilterToField2 и получили неудовлетворительный результат?
Владимир.

eeigor

Да.

Может, этот метод надо как-то задействовать?
Sub UnoFilterExecute()
Dim document As Object, dispatcher As Object

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Rem dispatcher.executeDispatch(document, ".uno:DataFilterStandardFilter", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:FilterExecute", "", 0, Array())
End Sub
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#14
Странно. Я проверял на системах:

Version: 7.2.5.2 / LibreOffice Community
Build ID: 20(Build:2)
CPU threads: 4; OS: Linux 5.4; UI render: default; VCL: gtk3
Locale: en-US (en_US.UTF-8); UI: en-US
Ubuntu package version: 1:7.2.5~rc2-0ubuntu0.20.04.1~lo1
Calc: threaded

и

Version: 7.3.0.3 (x64) / LibreOffice Community
Build ID: 0f246aa12d0eee4a0f7adcefbf7c878fc2238db3
CPU threads: 6; OS: Windows 10.0 Build 19042; UI render: default; VCL: win
Locale: ru-RU (ru_RU); UI: en-US
Calc: threaded

и

Версия: 6.4.7.2
ID сборки: 1:6.4.7-0ubuntu0.20.04.1+ci202105111545+astra3
Потоков ЦП: 4; ОС: Linux 5.4; Отрисовка ИП: по умолчанию; VCL: kf5;
Локаль: ru-RU (ru_RU.UTF-8); Язык интерфейса: ru-RU
Calc: threaded
Владимир.