макрос для запуска расширенного фильтра в Calc-е?

Автор MinasFilm, 6 ноября 2014, 03:08

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

MinasFilm

Макросы - начать запись
Данные - фильтр - раширенный фильтр - указываем все параметры (диапазон и т.д.)
применяем, смотрим что все ок
макросы - правка - смотрим на записанный код, и о чудо:
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


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

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


MinasFilm

Цитата: rami от  6 ноября 2014, 09:22Макрос расширенного фильтра

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

rami

У меня все файлы нормальные. Пишите подробней, что делаете, на каком шагу вылетает.
Я взял документ Расширенный фильтр.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

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

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

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

что собственно означает "Адрес результата"?

ПС. откуда вы все это знаете?  :D
я вот допустим createFilterDescriptorByObject не смог нагуглить ни в официальной вики , ни у Питоньяка
что нужно кушать читать, чтобы тоже стать таким умным?  :D ;)

rami

Цитата: MinasFilm от  6 ноября 2014, 21:06что собственно означает "Адрес результата"?
Это адрес верхней левой ячейки диапазона результата(в данном случае ячейка A35)

Цитата: MinasFilm от  6 ноября 2014, 21:06ПС. откуда вы все это знаете? 
я вот допустим createFilterDescriptorByObject не смог нагуглить ни в официальной вики , ни у Питоньяка
что нужно кушать читать, чтобы тоже стать таким умным?
Нужно знать места, где можно "покушать", почитать и стать умным 8-)
Питоньяк писал немного о фильтрах в сводных таблицах. В официальной вики в основном пишут об "офисном ширпотребе" — то, что нужно большинству не очень опытных пользователей. В основном нужно искать по форумам. На нашем форуме 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

Цитата: rami от  6 ноября 2014, 22:34Это адрес верхней левой ячейки диапазона результата(в данном случае ячейка A35)

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

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

rami

Цитата: MinasFilm от  6 ноября 2014, 23:08правда по "обновить данные" почему-то фильтр такой не пересчитывается - приходится удалять, и применять заново
Я дал вам новенький фильтр (в заводской упаковке) 8-), а вы его после каждой фильтрации кувалдой... :'(
Удалять ничего не нужно, меняйте критерии и обновляйте фильтр в меню "Данные" "Обновить диапазон". Чтобы меню стало активным нужно выбрать ячейку(любую) в исходном диапазоне. Даже макрос для этого не нужен.

MinasFilm

Цитата: rami от  6 ноября 2014, 12:41oFiltDesc=oCritRange.createFilterDescriptorByObject(oDataRange)

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

JohnSUN

А после сортировки ячейки A20:C22 не уползли куда-нибудь случайно?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

MinasFilm

Цитата: JohnSUN от  7 ноября 2014, 17:38
А после сортировки ячейки 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

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

MinasFilm

Цитата: rami от  7 ноября 2014, 17:11Как вы узнали, что перестал создаваться объект?
когда доходит до этого шага, возникает ошибка "Ошибка времени выполнения BASIC. Переменная типа Object не установлена."
при этом oFiltDesc = null
что никак не связано с некорректными условиями для фильтра, не так ли? ;)




rami

Цитата: MinasFilm от  7 ноября 2014, 17:36что никак не связано с некорректными условиями для фильтра, не так ли?
С условиями не связано.
Попробуйте переписать макрос:
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

Цитата: rami от  7 ноября 2014, 17:58Напишите какая у вас ось, версия офиса и что за документ, сколько листов, что ещё кроме диапазонов фильтра есть в документе?

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


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