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

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

18 Июнь 2019, 08:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Макрос для автофильтра по указанным параметрам  (Прочитано 951 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Pandrtek
Участник
**
Offline Offline

Сообщений: 6


« Стартовое сообщение: 4 Июнь 2019, 15:11 »

Добрый день.

Решил начать пользоваться макросами - нужно отфильтровать таблицу в 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


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

         

* Макрос.ods (12.33 Кб - загружено 4 раз.)
Записан
Bigor
Опытный пользователь
***
Offline Offline

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


« Ответ #1: 4 Июнь 2019, 17:04 »

Поищите по форуму, здесь много раз поднималась тема по фильтрации.
Например здесь.
Записан
Pandrtek
Участник
**
Offline Offline

Сообщений: 6


« Ответ #2: 4 Июнь 2019, 20:55 »

Поищите по форуму, здесь много раз поднималась тема по фильтрации.
Например здесь.

Есть Макрос и он работает на 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 и более условий?
« Последнее редактирование: 4 Июнь 2019, 21:00 от Pandrtek » Записан
Bigor
Опытный пользователь
***
Offline Offline

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


« Ответ #3: 4 Июнь 2019, 21:40 »

[ В чем ошибка? - Как указать 2 и более условий?

Вы не завершили первый цикл и начали второй. Короче нужен next, перед вторым for
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #4: 5 Июнь 2019, 09:28 »

Поищите по форуму, здесь много раз поднималась тема по фильтрации.
Например здесь.
REM  *****  BASIC  *****
Option VBASupport 1
По указанной ссылке можно было найти хороший пример от JohnSUN, а не уг на VBA.


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

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

Pandrtek
Участник
**
Offline Offline

Сообщений: 6


« Ответ #5: 6 Июнь 2019, 14:16 »

Добрый день

Все получилось - идет фильтрация по 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    



    
« Последнее редактирование: 6 Июнь 2019, 14:29 от Pandrtek » Записан
Bigor
Опытный пользователь
***
Offline Offline

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


« Ответ #6: 6 Июнь 2019, 14:18 »

Я не знаю, что такое фильтрация по возрастанию. Знаю сортировку, но это как бы разные вещи
Записан
Pandrtek
Участник
**
Offline Offline

Сообщений: 6


« Ответ #7: 6 Июнь 2019, 14:27 »

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

Да, "отсортировать по возрастанию" звучит правильнее.
Записан
Bigor
Опытный пользователь
***
Offline Offline

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


« Ответ #8: 6 Июнь 2019, 14:34 »

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 405


« Ответ #9: 6 Июнь 2019, 15:09 »

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

С уважением,
Михаил Каганский
Pandrtek
Участник
**
Offline Offline

Сообщений: 6


« Ответ #10: 7 Июнь 2019, 16:52 »

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

Добрый день.

Можно сначала отсортировать всё в диапазоне A:K, а потом скрыть строчки по условиям в столбцах J и K- не принципиально. Главное, чтобы в результате соблюдались 3 условия. Последовательность не важна здесь.
« Последнее редактирование: 7 Июнь 2019, 16:55 от Pandrtek » Записан
Pandrtek
Участник
**
Offline Offline

Сообщений: 6


« Ответ #11: 10 Июнь 2019, 11:27 »

Добрый день.

Может кто-то подсказать макрос по нескольким условиям - чтобы список сортировался по возрастанию (в одной колонке) и скрывал значения согласно заданным критериям по двум другим колонкам?
Или strarbasic или Visualbasic?
« Последнее редактирование: 10 Июнь 2019, 11:30 от Pandrtek » Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 978


« Ответ #12: 12 Июнь 2019, 00:34 »

Для этого нужно отсортировать список на месте по 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) В моем макросе скрытие идет кумулятивно, т.е. поверх видимого. Как надо на самом деле?

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

« Последнее редактирование: 12 Июнь 2019, 00:36 от economist » Записан

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

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