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

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

20 Август 2018, 18:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Сообщений: 320


« Ответ #15: 29 Январь 2018, 15:22 »

По ошибке, скорее всего твой openoffice еще не умеет так хорошо работать с vba как libre
Помогите тогда, пожалуйста, переписать код на starbasic.
Записан
OOKapitan
Старожил
****
Offline Offline

Сообщений: 320


« Ответ #16: 29 Январь 2018, 15:27 »

К стати, определять последнюю строку можно на подобие того, как это делается в макросе из этой темы: http://forumooo.ru/index.php/topic,6917.0/msg,44700.html
Только отнимать не 16, а сколько нужно здесь. количество строк после итога всегда одинаково.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Online Online

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


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


WWW
« Ответ #17: 29 Январь 2018, 15:52 »

Можешь попробовать такой вариант (должен работать и по AOO)
Код:
Sub fltrNonZero
Dim oCurrentController As Variant
Dim oSheet As Variant, oCursor As Variant, oDataArray As Variant, oStatus As Variant
Dim i As Long, m As Long
Dim aRow As Variant, oRows As Variant
oCurrentController = ThisComponent.getCurrentController()
oSheet = oCurrentController.getActiveSheet()
oCursor = oSheet.createCursor()
oCursor.gotoEndOfUsedArea(True)
oRows = oCursor.getRows()
oRows.IsVisible = True
oDataArray = oSheet.getCellRangeByPosition(9, 0, 9, oCursor.getRangeAddress().EndRow).getDataArray()
m = UBound(oDataArray)
oStatus = oCurrentController.getFrame().createStatusIndicator()
oStatus.start("", m)
For i = m To LBound(oDataArray) Step -1
If Trim(oDataArray(i)(0)) = "" Then oRows.getByIndex(i).IsVisible = False
If i Mod 50 = 0 Then oStatus.setValue(m-i)
Next i
oStatus.end()
End Sub
Записан

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

Сообщений: 904


« Ответ #18: 29 Январь 2018, 15:53 »

Неа, не работает. Сначала ругался на строку отключения обновления экрана. Удалил её. Теперь выдаёт ошибку - см. скрин

OpenOffice Calc поддерживает в 10 раз меньше VBA-комманд, чем LibreOffice. И это отставание растет.
Оснований использовать "отстающий по всем статьям" OpenOffice сейчас просто нет.
Единственное основание иметь OpenOffice рядом с LibreOffice - более правильное поведение при вставке в ODT графики.
  
Записан

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

Сообщений: 320


« Ответ #19: 29 Январь 2018, 16:00 »

Можешь попробовать такой вариант (должен работать и по AOO)
Работает. Но:
1) скрывается строка итога. Всё же хотелось бы её видеть (но если сложно реализовать - то не суть)ж
2) а ускорить код как-то можно?
Записан
Bigor
Старожил
****
Offline Offline

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


« Ответ #20: 29 Январь 2018, 16:08 »

Вот симбиоз макроса economist и JohnSUN Улыбка
Код:
Sub test_filtr
oSheet = ThisComponent.sheets(0)
oSheet.getRows().IsVisible = True
For i = 4 To  2500 'строки как в твоем примере
If oSheet.getCellByPosition(10,i).value< 1 Then
oSheet.getCellByPosition(10,i).getRows().IsVisible = False
EndIf
Next
msgbox "Завершено"
End Sub

работает медленнее первого, как понимаю за счет того что я не знаю как в starbasic запретить перерисовку

p.s. Блокировка перерисовки на скорость практически не повлияла
« Последнее редактирование: 29 Январь 2018, 16:40 от Bigor » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Online Online

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


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


WWW
« Ответ #21: 29 Январь 2018, 16:24 »

1) скрывается строка итога. Всё же хотелось бы её видеть (но если сложно реализовать - то не суть)ж
2) а ускорить код как-то можно?
2. Можно. Например, так:
Код:
Sub qickFltr
Dim oSheet As Variant, oEmpty As Variant, oRows As Variant, i As Long
oSheet = ThisComponent.getCurrentSelection().getSpreadsheet()
oSheet.getRows().IsVisible = True
oEmpty = oSheet.getColumns.getByIndex(9).queryEmptyCells()
For i = oEmpty.getCount()-1 To 0 Step -1
oEmpty.getByIndex(i).getRows().IsVisible = False
Next i
End Sub

1. Просто заранее в строке итогов (и в других, которые не нужно скрывать) в колонке J поставь что-нибудь, хотя бы пробел

Upd. Переписал чуть лаконичнее
« Последнее редактирование: 29 Январь 2018, 16:38 от JohnSUN » Записан

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

Сообщений: 320


« Ответ #22: 29 Январь 2018, 16:44 »

Можно. Например, так:
ВАУ, СУПЕР! Отработал мгновенно! Большущее спасибо.
Записан
OOKapitan
Старожил
****
Offline Offline

Сообщений: 320


« Ответ #23: 29 Январь 2018, 16:47 »

Вот симбиоз макроса economist и JohnSUN
Огромнейшее спасибо.
Записан
economist
Ветеран
*****
Offline Offline

Сообщений: 904


« Ответ #24: 30 Январь 2018, 09:45 »

В OpenOffice на StarBasic можно запретить перерисовку и ускорить код так (еще полезно, если уместно, запретить авторасчеты):

ThisComponent.LockControllers
ThisComponent.enableAutomaticCalculation(False)
 
И в конце кода, при выходе по ошибке -

ThisComponent.UnLockControllers
ThisComponent.enableAutomaticCalculation(True)
 
Записан

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

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


« Ответ #25: 30 Январь 2018, 10:07 »

блокировки уменьшают время выполнение примерно в 2 раза, но все равно вариант JohnSUN быстрее Улыбка
Записан
OOKapitan
Старожил
****
Offline Offline

Сообщений: 320


« Ответ #26: 30 Январь 2018, 15:47 »

но все равно вариант JohnSUN быстрее
Ну я пока на нём и остановился. Большое спасибо.
Записан
economist
Ветеран
*****
Offline Offline

Сообщений: 904


« Ответ #27: 31 Январь 2018, 12:18 »

Если "в лоб" сравнивать одинаковый код SB в OpenOffice|LibreOffice Calc и VBA в Excel - VBA в Excel выполняется быстрее в 2 раза.
Если "в лоб" сравнивать код SB в OpenOffice|LibreOffice Calc и VBA в LibreOffice Calc  - VBA в Calc медленнее на 40% (это заметно)

Путей ускорения макроса от Bigor несколько:

1) переписать цикл с прямого (step +1) на обратный (-1). Это связано с автоподбором высоты строки и разбивкой по страницам - при движении снизу вверх их меньше.  

2) использовать диапазоны Ranges или коллекции, например ячейки с комментариями.

Второе поясню примером. Скажем, надо удалить много конкретных строк (7, 12, 14, 2056, 4565 итд)
- Если удалять в этом же порядке - долго.
- Если удалять снизу вверх - быстрее в 4 раза.
- Если удалять коллекцией (поставив комментарии циклом по диапазону) - быстрее в 8 раз. Для "скрытия" - преимущество будет чуть меньше.

    
« Последнее редактирование: 31 Январь 2018, 12:20 от economist » Записан

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

Сообщений: 320


« Ответ #28: 31 Январь 2018, 12:20 »

- Если удалять коллекцией - быстрее в 8 раз
А можно пример кода, пожалуйста.
Записан
Bigor
Старожил
****
Offline Offline

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


« Ответ #29: 31 Январь 2018, 14:05 »

Я так понимаю вариант JohnSUN - работа с коллекцией. Он выбирает пустые ячейки и пробегаясь по ним скрывает строки.

Попробовал обратный цикл - значительного ускорения работы не замечено.
Да и мне, как пользователю, важно, что бы время написания макроса и время его работы, были бы меньше (или если работа нудная) сопоставимы с ручным выполнением работы. Конечно если макрос для многократного использования, то имеет смысл оптимизация, хотя обычно она упирается в лень Улыбка Работает, ну и нечего трогать Улыбка
Записан
Страниц: « 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!