Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

20 Апрель 2021, 17:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: [Решено] Calc: Как удалить расширенный фильтр?  (Прочитано 1602 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 514



« Стартовое сообщение: 25 Декабрь 2020, 17:24 »

Не могу найти API метод, делающий то же, что и записанный макрос.
Через диспетчер работает:
.uno:DataFilterRemoveFilter
« Последнее редактирование: 5 Январь 2021, 08:22 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 514



« Ответ #1: 25 Декабрь 2020, 22:07 »

Нашёл-таки (листинг 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
« Последнее редактирование: 25 Декабрь 2020, 22:10 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 379


WWW
« Ответ #2: 26 Декабрь 2020, 12:46 »

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

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

Кроме того, команда .uno:DataFilterRemoveFilter соответствует пункту меню Данные / Фильтр / Очистить Excel (метод  AutoFilter.ShowAllData). Автофильтр не удаляется, а очищается. Для удаления автофильтра нужно после предыдущей применить еще команду .uno:DataFilterHideAutoFilter.
« Последнее редактирование: 26 Декабрь 2020, 13:10 от sokol92 » Записан

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 514



« Ответ #3: 26 Декабрь 2020, 13:47 »

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

В Excel это выглядело бы так
Код:
If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If
Я помню, Вы говорили, что используете диспетчер в крайних случаях. Похоже, здесь как раз лучше использовать команду диспетчера.

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

Если есть другие советы, пишите...
« Последнее редактирование: 26 Декабрь 2020, 19:21 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 514



« Ответ #4: 26 Декабрь 2020, 19:16 »

На листе будут видны все строки, но в заголовке фильтра так и останутся "птички" в 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() пришлось реализовать, пользователь может заполнить подряд несколько строк с условиями.


* Bug with removeFilter.png (46.71 Кб, 366x489 - просмотрено 13 раз.)

* Снимок экрана от 2020-12-26 19-19-35.png (5.84 Кб, 257x171 - просмотрено 8 раз.)
* Без имени 2.ods (9.14 Кб - загружено 5 раз.)
« Последнее редактирование: 26 Декабрь 2020, 19:55 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 514



« Ответ #5: 27 Декабрь 2020, 20:06 »

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

При этом фильтр не удаляется (пункт меню "Данные/Ещё фильтры/Удалить фильтр" будет активен), а отменяется.
« Последнее редактирование: 27 Декабрь 2020, 20:12 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
economist
Форумчанин
***
Offline Offline

Сообщений: 1 423


« Ответ #6: 29 Декабрь 2020, 16:18 »

Ну и еще в коллекцию методов снятия Автофильтра для диапазонов баз данных, без удаления значков фильтра, и они становятся "черными", как и ожидает юзер:
Код:
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 задать как обычно

Этот способ избыточнее указанного выше, но лучше подходит, если критерии фильтрации берутся из ячеек т.е. когда лист используется вместо диалога интерфейса приложения), и при этом списки автофильтров тоже очищаются. А значит пользователь не будет удивлен.
« Последнее редактирование: 29 Декабрь 2020, 16:23 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 514



« Ответ #7: 5 Январь 2021, 08:21 »

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

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!