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

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

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

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice  без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: макрос для запуска расширенного фильтра в Calc-е?  (Прочитано 6741 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MinasFilm
Форумчанин
***
Offline Offline

Сообщений: 86


« Стартовое сообщение: 6 Ноябрь 2014, 03:08 »

Макросы - начать запись
Данные - фильтр - раширенный фильтр - указываем все параметры (диапазон и т.д.)
применяем, смотрим что все ок
макросы - правка - смотрим на записанный код, и о чудо:
Код:
sub PriceDacot1FltrGo
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 ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:DataFilterSpecialFilter", "", 0, Array())

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


end sub

т.е. никаких параметров явно никуда не передалось!

как жить дальше и как все-таки закодить передачу параметров в раширенный фильтр через макрос?
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 6 Ноябрь 2014, 11:22 »

Макрос расширенного фильтра

* Расширенный фильтр с макросом.ods (24.01 Кб - загружено 76 раз.)
Записан

MinasFilm
Форумчанин
***
Offline Offline

Сообщений: 86


« Ответ #2: 6 Ноябрь 2014, 14:17 »

Макрос расширенного фильтра

ммм... а вы уверены, что там с макросом все в порядке?
я 4 раза подряд открыл файлы из вложения, и каждый раз при переходе к коду макроса в редакторе calc у меня вылетал....
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #3: 6 Ноябрь 2014, 14:41 »

У меня все файлы нормальные. Пишите подробней, что делаете, на каком шагу вылетает.
Я взял документ Расширенный фильтр.ods  из предыдущей темы и добавил в него нижеприведённый макрос:
Код:
Sub UseAnAdvancedFilter Dim oCritRange, oDataRange, oFiltDesc      'Расширенный фильтр
oDataRange=ThisComponent.Sheets(0).getCellRangeByName("A1:C17")    'Данные
oCritRange=ThisComponent.Sheets(0).getCellRangeByName("A20:C22")   'Критерии
oFiltDesc=oCritRange.createFilterDescriptorByObject(oDataRange)
oFiltDesc.CopyOutputData=True
oFiltDesc.UseRegularExpressions=True
Dim oCellAddress As New com.sun.star.table.CellAddress             'Адрес результата
oCellAddress.Sheet=0
oCellAddress.Column=0
oCellAddress.Row=34
oFiltDesc.OutputPosition=oCellAddress
oDataRange.filter(oFiltDesc)
End Sub
Записан

MinasFilm
Форумчанин
***
Offline Offline

Сообщений: 86


« Ответ #4: 6 Ноябрь 2014, 23:06 »

Я взял документ Расширенный фильтр.ods  из предыдущей темы и добавил в него нижеприведённый макрос:

так написал же - после открытия вашег макроса в редакторе VBA, как только появляется код - и тут же вылетает с ошибкой...

не суть важно, скопипастил я ваш код из последнего поста, спасибо большое
только вот это поясните:
Код:
Dim oCellAddress As New com.sun.star.table.CellAddress             'Адрес результата
oCellAddress.Sheet=0
oCellAddress.Column=0
oCellAddress.Row=34
что собственно означает "Адрес результата"?

ПС. откуда вы все это знаете?  Веселый
я вот допустим createFilterDescriptorByObject не смог нагуглить ни в официальной вики , ни у Питоньяка
что нужно кушать читать, чтобы тоже стать таким умным?  Веселый Подмигивающий
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #5: 7 Ноябрь 2014, 00:34 »

что собственно означает "Адрес результата"?
Это адрес верхней левой ячейки диапазона результата(в данном случае ячейка A35)

ПС. откуда вы все это знаете? 
я вот допустим createFilterDescriptorByObject не смог нагуглить ни в официальной вики , ни у Питоньяка
что нужно кушать читать, чтобы тоже стать таким умным?
Нужно знать места, где можно "покушать", почитать и стать умным Крутой
Питоньяк писал немного о фильтрах в сводных таблицах. В официальной вики в основном пишут об "офисном ширпотребе" — то, что нужно большинству не очень опытных пользователей. В основном нужно искать по форумам. На нашем форуме http://forumooo.ru/index.php/topic,4281.0.html и http://forumooo.ru/index.php/topic,4303.0.html . На Linuxtopia . Ещё Питоньяк www.pitonyak.org/database/Calc_As_A_Simple_Database.odt
Записан

MinasFilm
Форумчанин
***
Offline Offline

Сообщений: 86


« Ответ #6: 7 Ноябрь 2014, 01:08 »

Это адрес верхней левой ячейки диапазона результата(в данном случае ячейка A35)

спасибо, заработало все как надо! Улыбка
(я вообще результат в отдельное место не копирую, просто фильтрую данные "по месту")
правда по "обновить данные" почему-то фильтр такой не пересчитывается - приходится удалять, и применять заново Грустный

Питоньяк писал немного о фильтрах в сводных таблицах. В официальной вики в основном пишут об "офисном ширпотребе" — то, что нужно большинству не очень опытных пользователей. В основном нужно искать по форумам.
и еще раз огромное спасибо за источники! Улыбка
(правда вот с английским не особо)
В свое время, когда кодил много на MS.O VBA, юзал MSDN ессно (где хорошо и понятно все классы-объекты-методы расписаны), ну еще и пару талмудов было на русском по серьезному кодингу в MS.O...
Но главное - постоянно была куча фриланс-заказов, и соотв. "оплачиваемая" возможность проф.роста... а тут погуглил - единственная нашлась вакансия в минский офис, кодить на С++ сам ОО походу))
А фриланса - вообще никакого
Видимо, проще привычно украсть Windows + MS.O, в крайнем случае даже заплатить, чем адаптировать и развивать свободный софт Грустный
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #7: 7 Ноябрь 2014, 01:42 »

правда по "обновить данные" почему-то фильтр такой не пересчитывается - приходится удалять, и применять заново
Я дал вам новенький фильтр (в заводской упаковке) Крутой, а вы его после каждой фильтрации кувалдой... Плачущий
Удалять ничего не нужно, меняйте критерии и обновляйте фильтр в меню "Данные" "Обновить диапазон". Чтобы меню стало активным нужно выбрать ячейку(любую) в исходном диапазоне. Даже макрос для этого не нужен.
Записан

MinasFilm
Форумчанин
***
Offline Offline

Сообщений: 86


« Ответ #8: 7 Ноябрь 2014, 17:21 »

oFiltDesc=oCritRange.createFilterDescriptorByObject(oDataRange)

в общем после сортировки листа с исходными данными в строке из цитаты отчего-то перестал создаваться объект Грустный
не подскажите, как локализовать причину? мб какие-то получить развернутое сообщение об ошибке, ну или посмотреть в исходных объектах какие-т ключевые параметры?..
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #9: 7 Ноябрь 2014, 17:38 »

А после сортировки ячейки A20:C22 не уползли куда-нибудь случайно?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
MinasFilm
Форумчанин
***
Offline Offline

Сообщений: 86


« Ответ #10: 7 Ноябрь 2014, 17:48 »

А после сортировки ячейки A20:C22 не уползли куда-нибудь случайно?

а у меня условия для фильтра на другом листе, который я не трогал Улыбка

в общем, приведу код на всякий:
Код:
sub PriceDacot1FltrGo
Dim oCritRange, oDataRange, oFiltDesc      'Расширенный фильтр
oDataRange=ThisComponent.Sheets(0).getCellRangeByName("A1:Z6000")    'Данные
oCritRange=ThisComponent.Sheets(1).getCellRangeByName("A1:Z10")   'Критерии
oFiltDesc=oCritRange.createFilterDescriptorByObject(oDataRange)
oFiltDesc.UseRegularExpressions=True
oDataRange.filter(oFiltDesc)
end sub
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #11: 7 Ноябрь 2014, 19:11 »

Скопировал ваш макрос "как есть" правильно работает.
в общем после сортировки листа с исходными данными в строке из цитаты отчего-то перестал создаваться объект
Как вы узнали, что перестал создаваться объект?
oCritRange=ThisComponent.Sheets(1).getCellRangeByName("A1:Z10")   'Критерии
У вас что более двухсот критериев Непонимающий По каким столбцам вы фильтруете? Сколько условий фильтрации? Хотя ваш фильтр отлично фильтрует(по крайней мере у меня), у вас излишний диапазон критериев может приводить к ошибкам в логике. Если фильтруете только по первому столбцу, достаточно
Код:
oCritRange=ThisComponent.Sheets(1).getCellRangeByName("A1:A3")   'Критерии
Ищите проблемы и ошибки у себя.
Записан

MinasFilm
Форумчанин
***
Offline Offline

Сообщений: 86


« Ответ #12: 7 Ноябрь 2014, 19:36 »

Как вы узнали, что перестал создаваться объект?
когда доходит до этого шага, возникает ошибка "Ошибка времени выполнения BASIC. Переменная типа Object не установлена."
при этом oFiltDesc = null
что никак не связано с некорректными условиями для фильтра, не так ли? Подмигивающий



Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #13: 7 Ноябрь 2014, 19:58 »

что никак не связано с некорректными условиями для фильтра, не так ли?
С условиями не связано.
Попробуйте переписать макрос:
Код:
Sub PriceDacot1FltrGo
Dim oCritRange, oDataRange, oFiltDesc      'Расширенный фильтр
oDataRange=ThisComponent.Sheets.getByIndex(0).getCellRangeByName("A1:Z6000")    'Данные
oCritRange=ThisComponent.Sheets.getByIndex(1).getCellRangeByName("A1:Z10")   'Критерии
oFiltDesc=oCritRange.createFilterDescriptorByObject(oDataRange)
oFiltDesc.UseRegularExpressions=True
oDataRange.filter(oFiltDesc)
End Sub
Напишите какая у вас ось, версия офиса и что за документ, сколько листов, что ещё кроме диапазонов фильтра есть в документе?
Записан

MinasFilm
Форумчанин
***
Offline Offline

Сообщений: 86


« Ответ #14: 7 Ноябрь 2014, 20:20 »

Напишите какая у вас ось, версия офиса и что за документ, сколько листов, что ещё кроме диапазонов фильтра есть в документе?

можно сделать проще - я приаттачеваю облегченную путем выбрасывания большей части данных версию исходного файла со всеми делами
гляньте плз, если вас не затруднит


и вот это
получить развернутое сообщение об ошибке, ну или посмотреть в исходных объектах какие-т ключевые параметры?..
мне все-таки тоже интересно, хотя бы на будущее

* price_temp.ods (140.7 Кб - загружено 22 раз.)
Записан
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

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