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

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

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

eeigor

#15
Владимир, Вы вызываете одни методы, а речь о стандартном фильтре. Можно как-то задействовать .uno:DataFilterStandardFilter? Может, этот метод всё и отработает правильно?
Хотя вряд ли. Всё дело в автофильтре.

Version: 7.2.5.2.0+ / LibreOffice Community
Build ID: 711f8d38e9451cd2fd39b6963d2a3fc166f04cb1
CPU threads: 8; OS: Linux 4.15; UI render: default; VCL: gtk3
Locale: ru-RU (ru_RU.UTF-8); UI: en-US
Calc: threaded
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Так макросами и выставляется стандартный фильтр. Моя цель - добиться корректной работы макросов. Указанная Вами команда относится к вызову диалога.
Владимир.

eeigor

Сколько кнопок автофильтра отображается у Вас после выполнения макроса? 2 или 3?
Я полагаю, что все 3. Потому что Вы не выделяете диапазон частично по двум крайним полям.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#18
Попробуйте добавить

Wait 50

перед предпоследней строкой ApplyFilterToField2.

 Wait 50
 oDisp.executeDispatch(oFrame, ".uno:DataFilterAutoFilter", "", 0, Array())  
End Sub


Так, стоп. Мы договаривались: открываем файл из #6 и сразу выполняем макрос. Никаких других действий.
Владимир.

eeigor

#19
Ваш код работает так же, как и мой в исходном варианте (1). Однако отображаются все кнопки автофильтра. В Вашем коде нет указания на то, что надо выделить только 2 столбца из 3-х, и включить автофильтр на выделенном ПОДдиапазоне. Под "включением" надо понимать "отображение" кнопок автофильтра.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Цитата: sokol92 от  6 февраля 2022, 18:01Так, стоп. Мы договаривались: открываем файл из #6 и сразу выполняем макрос. Никаких других действий.
Ну, какие-то действия мне приходится совершать, потому что кнопка Run не доступна. Потом будет доступна. Это уже глюк из другой оперы. Из модуля можно вызвать.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Диапазон, для которого выставляется фильтр, определяется именем книги Data. Переопределите его, если нужно фильтровать по 2 столбцам.
Владимир.

eeigor

#22
Цитата: sokol92 от  6 февраля 2022, 18:13Переопределите его, если нужно фильтровать по 2 столбцам.
Владимир, а вот так сработало. Фильтр наложен макросом, кнопки отображаются на 2 столбцах из трёх, кнопка автофильтра подсвечивается и т. д. Естественно, я уточнил индекс поля фильтра: 1 -> 0.
Спасибо за исследование

У меня есть в арсенале средств 2 процедуры: RangeOffset & RangeResize. Вот здесь и пригодятся.

И всё тот же вопрос. Значит, это не баг?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#23
А Вам спасибо за тему.

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

sokol92

Думаю, с практической точки зрения лучше использовать автофильтры для объектов DataBaseRange.
"Гораздо лучше с любой стороны".  :)
Владимир.

sokol92

Кстати, в ходе "исследования" обнаружил, как определить, есть ли на листе стрелки автофильтра - абсолютно "левым" путем.
' Определяет, имеет ли текущий (активный) лист стрелки автофильтра.
Option VbaSupport 1
Function AutoFilterMode() as Boolean
  Dim oExcelApp
  oExcelApp=CreateUnoService("ooo.vba.excel.Application")
  AutoFilterMode=oExcelApp.ActiveSheet.AutoFilterMode
End Function


Обратите внимание на использование переменной oExcelApp. Казалось бы, можно просто писать Application, однако макрос может находиться и в библтотеке приложения...
Мои знания не позволяют проанализировать (даже найти) исходный текст и определить возможный "прямой" путь.  ???

Вторая проблема - определить диапазон листа, для которого установлен автофильтр (если установлен). Нашел консультацию гуру @erAck, однако воспользоваться не смог.

Интересная тема - посмотреть, есть ли в "квази Excel" объектах еще что-нибудь полезное, что пока нельзя получить прямым путем.
Владимир.

eeigor

#26
@sokol92, добавляем в личную библиотеку макросов. Однозначно. :)
Модуль "Standard.VBASupport".

Option Explicit
Option VBASupport 1


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

On Local Error GoTo Failed
Dim oExcelApp As Object
oExcelApp = CreateUnoService("ooo.vba.excel.Application")
GetAutoFilterMode = oExcelApp.ActiveSheet.AutoFilterMode

Failed:
Exit Function
End Function

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

Sub SetAutoFilterMode(bValue As Boolean)
If GetAutoFilterMode() = bValue Then Exit Sub  'current value is equal to bValue

Dim document As Object, dispatcher As Object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
If bValue Then
dispatcher.executeDispatch(document, ".uno:DataFilterAutoFilter", "", 0, Array())
Else
dispatcher.executeDispatch(document, ".uno:DataFilterHideAutoFilter", "", 0, Array())
End If
End Sub

Sub Test_SetAutoFilterMode()
Dim bMode As Boolean: bMode = GetAutoFilterMode()
Print "ActiveSheet.AutoFilterMode = " & bMode

Call SetAutoFilterMode(Not bMode)
Print "ActiveSheet.AutoFilterMode = " & GetAutoFilterMode()
End Sub


:beer:
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Цитата: sokol92 от  6 февраля 2022, 21:58
Думаю, с практической точки зрения лучше использовать автофильтры для объектов DataBaseRange.

Кстати, Вы смотрели в сторону XUnnamedDatabaseRanges?
С уважением,
Михаил Каганский

sokol92

#28
Мне не удалось вызвать эти методы (из Basic). Вероятно, руки кривые.  :)
Владимир.

mikekaganski

Цитата: sokol92 от  7 февраля 2022, 16:51
У меня не удалось вызвать эти методы (из Basic).

Попробуйте получить свойство UnnamedDatabaseRanges у документа Calc (thisComponent).
С уважением,
Михаил Каганский