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

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

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

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice  без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 »   Вниз
  Печать  
Автор Тема: Переписать код VBA под Libreoffice Basic по поиску в массиве  (Прочитано 2128 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eugenefoxx
Участник
**
Offline Offline

Сообщений: 17


« Ответ #15: 2 Октябрь 2018, 20:58 »

economist - такого рода макрос [B1:B10000].FormulaLocal="=ВПР(ЧТО;ГДЕ;СТОЛБЕЦ;ЛОЖЬ)" я на раз два пилю, в цикле, но именно дело в том, что его применение ограничено, на больших объемах он не эффективен. Будет смотреть дальше, попробую массивы в  LOBasic раскусить. Частично мне этот метод известен, но еще не настолько, как VBA.
Записан
eugenefoxx
Участник
**
Offline Offline

Сообщений: 17


« Ответ #16: 7 Октябрь 2018, 11:23 »

economist - FormulaLocal не сразу увидел что Вы такую форму указали (я использовал просто Formula=). Проверил - да, результат на лицо. Я ее "разглядел" в вашем комментарии уже после того, как смог парсить в массиве в LOBasic. Скорость FormulaLocal  впечатляет. И по времени парсинг в массиве сильно уступает FormulaLocal. Беру на вооружение.
« Последнее редактирование: 7 Октябрь 2018, 12:05 от eugenefoxx » Записан
mikekaganski
Мастер
*****
Online Online

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


« Ответ #17: 7 Октябрь 2018, 13:23 »

Не могли бы Вы выложить пример таблицы с макросами с использованием Formula и FormulaLocal, чтобы можно было потестировать время выполнения?
Записан

С уважением,
Михаил Каганский
economist
Форумчанин
***
Offline Offline

Сообщений: 927


« Ответ #18: 8 Октябрь 2018, 16:36 »

Кхм, возможно я тут немного воды намутил. Я постоянно кодю в Excel и Calc одно-/попеременно, и многие вещи пишу по памяти. Благо "миры" обоих табличных редакторов, в т.ч. благодаря форумчанам, теперь сблизились до степени подобия (одинаковыми русскими функциями и поддержкой выполнения диалекта VBA в ODS и даже в XLS-файлах).    

FormulaLocal - специфический метод VBA в MS Excel для создания в ячейках "кириллических" формул. Т.е. он нужен в Excel чтобы не писать =VLOOKUP(), а просто копировать готовую отрепетированную формулу в код прямо из книги: =ВПР(). Просто Local - в коде с ="=ВПР()" - даст в Excel ошибку.

Теперь то же самое в Calc:  
"просто" Formula, FormulaR1C1 - в LO 5.4.5.1-6.01-6.1.0.3 прекрасно работает и с английскими, и русскими формулами. Т.е. FormulaLocal в LO - не нужна, её просто нет, и у меня она в Calc (в формате ODS) - вообще даёт ошибку !

eugenefoxx - а вы уверены что такой код у вас работает именно в Calc, а не в Excel (и какое расширение у файла)? -
Код:
option vbasupport 1
option Compatible

sub test
[A1:A3]=1
[A4].FormulaLocal="=СУММ(A1:A3)"
[A4].font.bold=true
end sub  

В Calc у меня дает ошибку на [A4].FormulaLocal="=СУММ(A1:A3)"

И ускорения (даже теоретически) от замены одной команды на другую - ни в Calc, ни в Excel быть не должно.  Это ведь просто в VBA, на мой взгляд, способ упростить синтаксическому анализатору задачу "понимания" и пре-компиляции кода.

 
Записан

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

Сообщений: 17


« Ответ #19: 9 Октябрь 2018, 05:56 »

mikekaganski - Прилагаю файл с примером кода с двумя методами - Formula и FormulaLocal. Запуск через Tools - Macros - Run Macro... Как я понял, FormulaLocal использует Local системы и тем быстрее обрабатывает данные).

* test_formula.ods (1560.75 Кб - загружено 9 раз.)
« Последнее редактирование: 9 Октябрь 2018, 08:07 от eugenefoxx » Записан
eugenefoxx
Участник
**
Offline Offline

Сообщений: 17


« Ответ #20: 9 Октябрь 2018, 06:28 »

economist - Правда, хочу заметить. Первоначально про быстроту кода я говорил в отношении Linux. FormulaLocal выполняется здесь за несколько секунд. В отношении этого кода на Windows реализованную через эмулятор Qemu на машине, где и Linux, к таким быстрым исполнениям не приводит в обоих методах.
Записан
mikekaganski
Мастер
*****
Online Online

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


« Ответ #21: 9 Октябрь 2018, 08:49 »

Хм... ну что ж.

А теперь можно сравнить скорость следующих двух реализаций:

Код:
Sub testFormulaLocal
Dim t as integer
n = Now()
oSheet = ThisComponent.Sheets(0)
For t = 5 to 15000 'SAP склад
   oSheet.getCellByPosition (11, t).FormulaLocal = "=IFERROR(VLOOKUP(B" & t+1 & ";Sheet2.$O$1:$O$1048576;1; );"")"
Next t

MsgBox (Format(Now() - n, "Данные обработаны! [s] с")
End Sub

Код:
Sub testRangeFormula
Dim t as integer
n = Now()
oSheet = ThisComponent.Sheets(0)
r = oSheet.getCellRangeByName("L6:L15001") ' то же самое, что oSheet.getCellByPosition (11, (5..15000)+1)
dim f(0 to r.Rows.Count-1, 0 to 0) as String
For t = 0 to r.Rows.Count-1 'SAP склад
   f(t, 0) = "=IFERROR(VLOOKUP(B" & r.Rows(t).RangeAddress.StartRow + 1 & ";Sheet2.$O$1:$O$1048576;1; );"")"
Next t
r.setFormulaArray(f)

MsgBox (Format(Now() - n, "Данные обработаны! [s] с")
End Sub

И заодно проверить, как работает первая из них в русском интерфейсе при отключённом английском языке формул (дефолтная настройка для русскоязычных систем). Использование конструкций типа FormulaLocal для задания программно-заданных строк вредно (за исключением случая, когда совершенно ничего не понимающий в макросах человек пытается по советам из интернета построить макрос для своей локальной задачи, не думая о том, как оно заработает у соседа).
« Последнее редактирование: 9 Октябрь 2018, 09:11 от mikekaganski » Записан

С уважением,
Михаил Каганский
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #22: 9 Октябрь 2018, 09:19 »

Когда вы формируете строку для формулы (или запроса для базы) в макросе, нужно вместо пары кавычек (пустая строка) писать четыре:
Код:
";Sheet2.$O$1:$O$1048576;1; );"""")"   ' <— это часть формулы
Записан

mikekaganski
Мастер
*****
Online Online

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


« Ответ #23: 9 Октябрь 2018, 11:44 »

Баг насчёт неоправданно медленного задания Formula.
Записан

С уважением,
Михаил Каганский
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #24: 9 Октябрь 2018, 12:47 »

mikekaganski, нужно было поправить формулу в образце документа для бага, как я писал выше. А то макрос пишет в ячейки всякий бред, который нарастает с каждым просмотром формулы в мастере формул. Офис каждый раз пытается сам поправить формулу, но не получается.
Записан

mikekaganski
Мастер
*****
Online Online

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


« Ответ #25: 9 Октябрь 2018, 12:49 »

Это да, но это не имеет значения в данном случае, поскольку от этого не меняется картина
Записан

С уважением,
Михаил Каганский
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #26: 9 Октябрь 2018, 13:23 »

На скорость это почти не влияет, но при удалении всего диапазона с неправильными формулами комп подвисает секунд на 20, да и вид у поломанных формул печальный, "что о нас подумает Марья Ивановна Непонимающий"

Кстати, у меня макрос testformulalocal отрабатывает за ~17 сек.
Записан

mikekaganski
Мастер
*****
Online Online

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


« Ответ #27: 9 Октябрь 2018, 13:27 »

"что о нас подумает Марья Ивановна Непонимающий"

Ну, не "о нас", только обо мне Подмигивающий
Записан

С уважением,
Михаил Каганский
economist
Форумчанин
***
Offline Offline

Сообщений: 927


« Ответ #28: 9 Октябрь 2018, 14:27 »

про быстроту кода я говорил в отношении Linux. FormulaLocal выполняется здесь за несколько секунд.

Прочел и понял что .FormulaLocal - это у ТС команда StarBasic (LO Basic), а не VBA. Ох уж эти "однофамильцы"...
« Последнее редактирование: 9 Октябрь 2018, 14:35 от economist » Записан

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

Сообщений: 17


« Ответ #29: 9 Октябрь 2018, 21:36 »

rami,
Когда вы формируете строку для формулы (или запроса для базы) в макросе, нужно вместо пары кавычек (пустая строка) писать четыре:
Код:
";Sheet2.$O$1:$O$1048576;1; );"""")"   ' <— это часть формулы
спасибо за подсказку, видел "проблему" с этим, но не знал как исправить.
Записан
Страниц: « 1 2 3 »   Вверх
  Печать  
 
Перейти в:  

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