Как подавить вывод сообщения при применении Автофильтра?

Автор eeigor, 2 августа 2022, 10:38

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

eeigor

Из всей таблицы выбрано лишь 2 поля, по которым надо установить Автофильтр. Как подавить вывод сообщения? Перед установкой Автофильтра выделяются две ячейки заголовков заданных полей.
Ответ на запрос: Да (скриншот 1).

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

Возможно, задачу надо решать по-другому, а не как поставлен вопрос.


Edit 1:
Вот этот самый флаг ("Диапазон содержит подписи столбцов") спрятан в параметрах Стандартного фильтра (см. скриншот 2).
    Dim oFilterDsc As Object  'filter descriptor
   Dim oRange As Object
   oRange = oSheet.getCellRangeByPosition(1, 1, 2, 1)  'выбранные заголовки
   oFilterDsc = oRange.createFilterDescriptor(True)  'bEmpty:=True
   ' NOTE: Ensures that the "Range contains column labels" flag is set the next time
   '       you manually open the "Standard Filter" dialog box.
   oFilterDsc.ContainsHeader = True
   oRange.filter(oFilterDsc)

   ThisComponent.CurrentController.select(oRange)
   Call UnoDataFilterAutoFilter

Sub UnoDataFilterAutoFilter()
''' Toggle the AutoFilter.
   Dim document As Object, dispatcher As Object

   document = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   dispatcher.executeDispatch(document, ".uno:DataFilterAutoFilter", "", 0, Array())
End Sub


Эта строка (oFilterDsc.ContainsHeader = True) решает задачу, но выглядит как-то не очень...
В примере выше применяется пустой фильтр и затем устанавливается Автофильтр (отображаются кнопки раскрывающихся списков).
Побочный эффект: все заголовки строк в фактически неотфильтрованном наборе данных отображаются синим цветом (как будто фильтр применён).

Edit 2:
В Excel нет таких сложностей с отображением кнопок Автофильтра. И текущее состояние можно получить (FilterMode).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#1
Помнится, нам Михаил предлагал один нестандартный способ (не сразу его нашёл) с использованием анонимных диапазонов.
Там тоже не всё гладко*...
Вот такой вариант решения задачи.

Function GetAutoFilterMode(Optional nSheet%) As Boolean
''' Returns: True if the AutoFilter drop-down arrows are currently displayed on the sheet.

   On Local Error GoTo Failed
   Dim oUnnamedDBRanges As Object, oAnonSheetDB As Object  'anonymous DatabaseRange

   If IsMissing(nSheet) Then
       nSheet = ThisComponent.CurrentController.ActiveSheet.RangeAddress.Sheet
   End If
   oUnnamedDBRanges = ThisComponent.getPropertyValue("UnnamedDatabaseRanges")
   oAnonSheetDB = oUnnamedDBRanges.getByTable(nSheet)  '<- ScDatabaseRangeObj
   GetAutoFilterMode = oAnonSheetDB.AutoFilter

Failed:
End Function

Sub Test_GetAutoFilterMode()
   Print "ActiveSheet.AutoFilterMode = " & GetAutoFilterMode()
End Sub


И хотя мы работаем с обычным диапазоном, но зд. используется анонимный диапазон базы данных (ScDatabaseRangeObj). Но он "откликается" на кнопки Автофильтра обычного диапазона (похоже, его интересует не диапазон, а сам лист: метод getByTable). В общем, что-то неоднозначное...

Какие будут соображения?

_____
* Особенно, если попытаться присваивать значение свойству: oAnonSheetDB.AutoFilter = bValue
    Получим чехарду на листе.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

В параметры функции из прошлого сообщения должен быть добавлен документ (сейчас функция применяется только для ThisComponent).
У меня похожая функция (алгоритм тот же).

' Возвращает DatabaseRange (анонимный) для автофильтра листа или Nothing.
' - oDoc   документ Calc.
' - oSheet лист документа.
Function GetSheetFilterDBRange(oDoc, oSheet) as Object
  Dim i as Long
  GetSheetFilterDBRange=Nothing
  i=oSheet.RangeAddress.Sheet
  With oDoc.getPropertyValue("UnnamedDatabaseRanges")
    If .hasByTable(i) Then GetSheetFilterDBRange=.getByTable(i)
  End With
End Function


Выставлен ли фильтр можно определить по свойству AutoFilter возвращаемого непустого объекта.

Право иметь собственные сохраняемые фильтры, кроме листа предоставлено DatabaseRange и сводной таблице.
Владимир.

eeigor

Цитата: eeigor от  2 августа 2022, 10:38oRange = oSheet.getCellRangeByPosition(1, 1, 2, 1)
Я добавил вторую строку к диапазону (под заголовками, пустую, до вывода данных).
oRange = oSheet.getCellRangeByPosition(1, 1, 2, 2)

Сообщение исчезло.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community