Макрос для автофильтра по указанным параметрам

Автор Pandrtek, 4 июня 2019, 15:11

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

Pandrtek

Добрый день.

Решил начать пользоваться макросами - нужно отфильтровать таблицу в Open Office по заранее известным параметрам (которые нужно прописать в макросе).

Нужно чтобы в итоге отобразилась таблица, где "наименование" с признаком "кг", комментарий с признаком "не пусто".

При автоматической записи макроса ничего не происходит - только появляются и пропадают значки фильтра у заданного диапазона.

Почему не получается? Вот как выглядит автоматический макрос:

sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1:$D$11"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:DataFilterAutoFilter", "", 0, Array())

rem ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:DataFilterStandardFilter", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:FilterExecute", "", 0, Array())


end sub


Заранее спасибо.

         

bigor

Поищите по форуму, здесь много раз поднималась тема по фильтрации.
Например здесь.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Pandrtek

#2
Цитата: Bigor от  4 июня 2019, 17:04
Поищите по форуму, здесь много раз поднималась тема по фильтрации.
Например здесь.

Есть Макрос и он работает на 1 условие:

REM  *****  BASIC  *****
Option VBASupport 1

Sub test_filtr1

Application.ScreenUpdating=false                    

For Each r in [j5:j2500]                          

If r.value =""  Then r.entirerow.hidden=true      ' (1ое условие - скрыть все что пусто в стобце j5:j2500)
   
Next
Application.ScreenUpdating=true
msgbox "Готово 1!"

End Sub


Пытался в него добавить 2 условие, просто скопировав первое и поменяв название столбца:


For Each r in [j5:j2500]                      (где столбец J меняется на столбец K)                    

If r.value =""  Then r.entirerow.hidden=true
     


Получилось:

REM  *****  BASIC  *****
Option VBASupport 1

Sub test_filtr1

Application.ScreenUpdating=false                    

For Each r in [j5:j2500]                          

If r.value =""  Then r.entirerow.hidden=true             ' (1ое условие - скрыть все что пусто в стобце j5:j2500)

For Each r in [k5:k2500]                          

If r.value <10  Then r.entirerow.hidden=true            ' (2ое условие - скрыть все меньше 10 в стобце k5:k2500)
   
Next
Application.ScreenUpdating=true
msgbox "Готово 1!"

End Sub



В результате система пишет, что "End Sub - неожиданный". В чем ошибка? - Как указать 2 и более условий?

bigor

Цитата: Pandrtek от  4 июня 2019, 20:55
[ В чем ошибка? - Как указать 2 и более условий?

Вы не завершили первый цикл и начали второй. Короче нужен next, перед вторым for
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

rami

Цитата: Bigor от  4 июня 2019, 17:04
Поищите по форуму, здесь много раз поднималась тема по фильтрации.
Например здесь.
Цитата: Pandrtek от  4 июня 2019, 20:55REM  *****  BASIC  *****
Option VBASupport 1
По указанной ссылке можно было найти хороший пример от JohnSUN, а не уг на VBA.


Pandrtek, фразы "Решил начать пользоваться макросами..." и "Option VBASupport 1" не совместимы, либо первое, либо второе. "Option VBASupport 1" предназначен для тех, кому нужно в считанные дни или недели перейти с Excel на LibreOffice, он помогает адаптировать существующие VBA-макросы с минимальными проблемами (т.к. поддержка VBA-макросов не полная). Если хотите нормально пользоваться макросами в LibreOffice, забудьте про VBA-макросы и опции их поддержки.

Выложите на форуме документ с образцом данных (думаю, достаточно заполнить в новом документе диапазон J5:K50 с вашими данными).

Pandrtek

#5
Добрый день

Все получилось - идет фильтрация по 2 условиям.
Хочу добавить 3ье условие - фильтр по возрастанию для такого же диапазона, но в колонке с - [с5:с2500].

Подскажите что нужно дописать в макросе:

REM  *****  BASIC  *****
Option VBASupport 1

Sub test_filtr1

Application.ScreenUpdating=false

For Each r in [j5:j2500]                          

If r.value =""  Then r.entirerow.hidden=true            ' (1ое условие - скрыть все что пусто в стобце j5:j2500)

Next

For Each r in [k5:k2500]                          

If r.value <10  Then r.entirerow.hidden=true            ' (2ое условие - скрыть все, что меньше 10 в стобце k5:k2500)

?
?                                                                          ' (3ье условие - сортировать по возрастанию значения по стобцу c5:c2500 в диапазоне A5:K2500, так чтобы значения сортировались вместе во всех  
?                                                                          '  ячейках A5:K2500, т.е. обычный фильтр с сортировкой по возрастанию для столбца c5:c2500, который делается вручную)
?


Next

Application.ScreenUpdating=true
msgbox "Готово 1!"

End Sub    



   

bigor

Я не знаю, что такое фильтрация по возрастанию. Знаю сортировку, но это как бы разные вещи
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Pandrtek

Цитата: Bigor от  6 июня 2019, 14:18
Я не знаю, что такое фильтрация по возрастанию. Знаю сортировку, но это как бы разные вещи

Да, "отсортировать по возрастанию" звучит правильнее.

bigor

Вот здесь и случилось о чем писал rami, форум по OO/LibreOffice, ты решил использовать макрос на vba. Так что придется ждать пока Economist зайдет в тему или переписывать все на starbasic. Ну или задать этот вопрос на excel форумах и потом надеяться, что макрос в режиме совместимости правильно отработает на OO/LibreOffice.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

Прикольно. Сначала скрыли строки, в которых были маленькие значения столбцов J  и K. А потом решили отсортировать целый диапазон, в который входят эти ячейки с маленькими значениями, в соответствии с данными столбца C.
С уважением,
Михаил Каганский

Pandrtek

#10
Цитата: mikekaganski от  6 июня 2019, 15:09
Прикольно. Сначала скрыли строки, в которых были маленькие значения столбцов J  и K. А потом решили отсортировать целый диапазон, в который входят эти ячейки с маленькими значениями, в соответствии с данными столбца C.

Добрый день.

Можно сначала отсортировать всё в диапазоне A:K, а потом скрыть строчки по условиям в столбцах J и K- не принципиально. Главное, чтобы в результате соблюдались 3 условия. Последовательность не важна здесь.

Pandrtek

#11
Добрый день.

Может кто-то подсказать макрос по нескольким условиям - чтобы список сортировался по возрастанию (в одной колонке) и скрывал значения согласно заданным критериям по двум другим колонкам?
Или strarbasic или Visualbasic?

economist

#12
Для этого нужно отсортировать список на месте по 1-й колонке, а потом скрыть ненужное, глядя во 2-ю и 3-ю колонку.
Т.е. макрос разбить на два-три. Вы, в принципе, решили задачу, нужно просто доделать первую часть.
Макрорекордер в Сalс тоже есть, и он вполне запишет за вашими действиями по сортировке что-нить такое:

sub Sort_AC_col
dim document as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint "
args1(0).Value = "$A$5:$C$10"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:SortAscending", "", 0, Array())
Call Hide_B
end sub  

А второй и третий макрос будет похож на ваш:

Option VBASupport 1
Sub Hide_B()
For Each r in [B5:B10]                          
If r.value < [B2] Then r.entirerow.hidden=true            ' (2ое условие - скрыть все, что меньше 10 в стобце k5:k2500)
Next
Call Hide_C
End sub

Sub Hide_C()
For Each r in [C5:C10]                          
If r.value < [C2] Then r.entirerow.hidden=true            ' (2ое условие - скрыть все, что меньше 10 в стобце k5:k2500)
Next
End sub


Но нужно заранее подумать о том:
1) может ли понадобиться исходная сортировка? Если да - нужен столбец с № п/п (индексом) для "восстановления" и макрос.
2) критерий скрытия, ячейки [B2] и [C2] задаются 1 раз или меняется в произвольный момент времени? Или они будут в коде (жесткие)?
3) В моем макросе скрытие идет кумулятивно, т.е. поверх видимого. Как надо на самом деле?

Данную задачу можно решить и без макросов, формулами (если речь о небольшом "отчете") или Сводной таблицей, умеющей и скрывать пустое или по критерию, и сортировать результат на лету. И обновляется само, и может быть на другом листе, как готовый "Отчет".    

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