[Решено] Calc: Как удалить расширенный фильтр?

Автор eeigor, 25 декабря 2020, 17:24

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

eeigor

Не могу найти API метод, делающий то же, что и записанный макрос.
Через диспетчер работает:
.uno:DataFilterRemoveFilter
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#1
Нашёл-таки (листинг 6)... Установка пустого фильтра на листе удалит все фильтры для этого листа.
Sub RemoveSheetFilter()
 Dim oSheet          ' Sheet to filter.
 Dim oFilterDesc     ' Filter descriptor.

 oSheet = ThisComponent.getSheets().getByIndex(0)
 oFilterDesc = oSheet.createFilterDescriptor(True)
 oSheet.filter(oFilterDesc)
End Sub
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#2
Тут есть некий обман зрения (по крайней мере, в текущих версиях Calc). :)

Занесите в столбeц "A" новой книги последовательно Field, 1, 2, 3, 4, 5 (6 ячеек). Примените автофильтр и выделите, например, 1,3,5.
Далее, выполните макрос из предыдущего ответа. На листе будут видны все строки, но в заголовке фильтра так и останутся "птички" в 1,3,5. На мой взгляд, это баг, о котором следует сообщить. Если Выполнить команду Диспетчера, указанную Вами, то будут отображены все строки и заголовок фильтра очистится.

Кроме того, команда .uno:DataFilterRemoveFilter соответствует пункту меню Данные / Фильтр / Очистить Excel (метод  AutoFilter.ShowAllData). Автофильтр не удаляется, а очищается. Для удаления автофильтра нужно после предыдущей применить еще команду .uno:DataFilterHideAutoFilter.
Владимир.

eeigor

#3
sokol92, большое спасибо. Я ещё разбираюсь с этим.

В Excel это выглядело бы так
If ActiveSheet.FilterMode Then
   ActiveSheet.ShowAllData
End If

Я помню, Вы говорили, что используете диспетчер в крайних случаях. Похоже, здесь как раз лучше использовать команду диспетчера.

В примере от rami не хватает (ради полноты вопроса) возможности удалять фильтр. У А.Питоньяка тоже нет.
Собственно говоря, я из-за миграции на LO Calc, реализую возможность автофильтрации данных, как в примере на Excel. Осталось совсем немного: отменить фильтр, если нет условий, так как при пустом фильтре данные не выводятся (требуется, как минимум ввести:  ".*").

Если есть другие советы, пишите...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#4
Цитата: sokol92 от 26 декабря 2020, 12:46На листе будут видны все строки, но в заголовке фильтра так и останутся "птички" в 1,3,5. На мой взгляд, это баг, о котором следует сообщить.
Да, это очевидно.
Значит, пока делаем отмену фильтрации только через команду диспетчера.
Но решение через API-методы мы ждем от гуру нашего форума.
В моем ответе #3 есть ссылка на форум Excel. Это хороший и нужный пример, и хотелось бы воспроизвести его в LO Calc. Кода получается значительно больше...

А пример снятия фильтра на скриншоте ниже. При этом после выполнения кода в ответе #1 все строки появились.

А код, который в Excel работал с AdvancedFilter был такой

Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Target, Range("A2:L5")) Is Nothing Then
       'On Error Resume Next
       
       Application.ScreenUpdating = False
       If ActiveSheet.FilterMode Then
           ActiveSheet.ShowAllData
       End If
       
       Range("База_данных[#All]").AdvancedFilter Action:=xlFilterInPlace _
        , CriteriaRange:=Range("Условия").CurrentRegion  'Action:=xlFilterCopy

       ActiveWindow.ScrollRow = 10
       Application.ScreenUpdating = True
   End If
End Sub


В Excel это вообще была единственная возможность соединить условия фильтра оператором "ИЛИ". В LO Calc, как я вижу, стандартный фильтр тоже позволяет соединить условия через оператор "ИЛИ".
Смысл затеи в том, что при частом использовании постоянно лезть в меню неудобно. Фильтр должен быть "живым", под рукой...
Функцию CurrentRegion() пришлось реализовать, пользователь может заполнить подряд несколько строк с условиями.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#5
Кстати, такой способ "удаления" расширенного (или другого) фильтра, как сделать скрытые строки видимыми, тоже работает.
<object>.Rows.IsVisible = True
REM Например:
ThisComponent.DatabaseRanges.getByName("БД").ReferredCells.Rows.IsVisible = True


При этом фильтр не удаляется (пункт меню "Данные/Ещё фильтры/Удалить фильтр" будет активен), а отменяется.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

economist

#6
Ну и еще в коллекцию методов снятия Автофильтра для диапазонов баз данных, без удаления значков фильтра, и они становятся "черными", как и ожидает юзер:

dispatcher.executeDispatch(document, ".uno:DataFilterRemoveFilter", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:DataFilterHideAutoFilter", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:DataFilterAutoFilter", "", 0, Array())


Впрочем, для надежности срабатывания стоит выделить к-либо ячейку из первый строки диапазона, перед последней командой:
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1()) ' args1 задать как обычно

Этот способ избыточнее указанного выше, но лучше подходит, если критерии фильтрации берутся из ячеек т.е. когда лист используется вместо диалога интерфейса приложения), и при этом списки автофильтров тоже очищаются. А значит пользователь не будет удивлен.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

eeigor

"Лучший" способ отмены расширенного фильтра, на мой взгляд, дан в ответе #5: сделать строки видимыми.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community