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

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

28 Май 2017, 13:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 4 »   Вниз
  Печать  
Автор Тема: Заблокировать работу с документом на время работы макроса  (Прочитано 2582 раз)
0 Пользователей и 1 Гость смотрят эту тему.
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #15: 2 Декабрь 2016, 18:38 »

Да, я об этом варианте тоже подумал, но решил, что формула =A1 выглядит все-таки не так страшно, как =SUM(A1)  Подмигивающий
« Последнее редактирование: 5 Декабрь 2016, 15:56 от JohnSUN » Записан

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

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


« Ответ #16: 3 Декабрь 2016, 14:20 »

Как это будет работать, если CountUsr > 30?

EDIT: вроде работает, если число аргументов SUM больше 30.
« Последнее редактирование: 3 Декабрь 2016, 14:23 от mikekaganski » Записан

С уважением,
Михаил Каганский
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #17: 3 Декабрь 2016, 15:23 »

На худой конец остается вариант с SUMIF или SUMPRODUCT от диапазона, полученного через OFFSET и прореженного с помощью чего-то типа MOD(COLUMN(диапазона суммирования);CountUsers)=чего-то там такое, связанное с текущей колонкой... Формула будет зубодробительной, но зато параметров будет гораздо меньше тридцати
« Последнее редактирование: 5 Декабрь 2016, 15:56 от JohnSUN » Записан

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

Сообщений: 114


« Ответ #18: 5 Декабрь 2016, 10:06 »

Как это будет работать, если CountUsr > 30?
Почему вопрос возник с числом 30? Есть место быть какому-то подвоху?

Продолжу тему с блокировкой.... или не пойму с чем связано:

Есть вот такой момент кода:

Код:
Sub BeginUpdateRep
ThisReport.isUndoEnabled=False
if shtReport.isProtected() Then shtReport.unprotect(Pass)
sViewData = ThisReport.GetCurrentController.GetViewData()
ThisReport.lockControllers()
ThisReport.AddActionLock()
End Sub

Sub EndUpdateRep
ThisReport.RemoveActionLock()
ThisReport.UnlockControllers()
ThisReport.getCurrentController.RestoreViewData(sViewData)
shtReport.protect(Pass)
ThisReport.isUndoEnabled=True
End Sub
и далее где-то в коде есть вот такой вызов
Код:
....
BeginUpdateRep
LoadRep(I)
EndUpdateRep
.....

Так вот после выполнения, почему-то формулы типа =SUM(G15;M15;S15) не работают. После выполнения кода нажимаем F9 и все считается.
Но если закомментировать:
Код:
....
'BeginUpdateRep
LoadRep(I)
'EndUpdateRep
.....
Формулы начинают работать верно, но тормоза.... Из-за чего это может быть?
Хотел сделать тестовый файл, с примерным кодом, но в нем все работает как положено.
Записан
mikekaganski
Старожил
****
Offline Offline

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


« Ответ #19: 5 Декабрь 2016, 10:15 »

Почему вопрос возник с числом 30? Есть место быть какому-то подвоху?

Если честно - моя лень.
В описании функции SUM указано, что число аргументов - до 30. Я проверил с 32 - работает. Но мне лень лезть в код и смотреть, как там реализовано и можно ли реально туда передавать любое число аргументов.

Продолжу тему с блокировкой.... или не пойму с чем связано:
...

https://forum.openoffice.org/en/forum/viewtopic.php?f=45&t=54868

EDIT: для того, чтобы пересчитать только "dirty cells" (F9), используйте не ThisComponent.calculateAll() (Ctrl+Shift+F9), а ThisComponent.calculate().

http://opengrok.libreoffice.org/xref/core/offapi/com/sun/star/sheet/XCalculatable.idl
« Последнее редактирование: 5 Декабрь 2016, 10:26 от mikekaganski » Записан

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

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #20: 5 Декабрь 2016, 10:29 »

В описании функции SUM указано, что число аргументов - до 30. Я проверил с 32 - работает. Но мне лень лезть в код и смотреть, как там реализовано и можно ли реально туда передавать любое число аргументов.
Тридцатый аргумент забирает все оставшиеся лишними аргументы, до определённого предела это может работать, потом будет всякая ересь.
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #21: 5 Декабрь 2016, 10:48 »

Почему вопрос возник с числом 30? Есть место быть какому-то подвоху?
Ну, скажем так - "долгое время было место подвоху"  Смеющийся
Долгое время любые обсуждения проблем с вычислениями в Calc начинались с заявления "А вот в Экселе то-то и то-то..." Это сильно раздражало и продвинутых пользователей, и разработчиков, и просто фанатов. А некоторых просто бесило. Но, тем не менее, заставляло разработчиков "гнаться за совместимостью" - делать всё похожим на Эксель. А в Экселе, например, долгое время количество параметров во встроенной функции было ограничено именно тридцатью штуками.
Времена изменились, сейчас это ограничение выросло (если верить справке) до 255, пользователи задавая вопросы уже пишут "А вот в Гугль-Таблицах то-то и то-то...", а старые п... п... профессионалы типа меня, mikekaganski (и, мне так почему-то кажется - остальные ветераны тоже) опасаются вводить много параметров в функцию. Мало того, что можешь превысить какой-то лимит, так еще и читать-перечитывать потом эту бесконечную "портянку" замучаешься.
« Последнее редактирование: 5 Декабрь 2016, 15:56 от JohnSUN » Записан

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

Сообщений: 114


« Ответ #22: 5 Декабрь 2016, 15:04 »

ThisComponent.calculate().
Спасибо Всё заработало как надо

А у меня вопрос еще по процедурам BeginUpdateRep и EndUpdateRep код которых выше. Правильно ли последовательность вызовов в них, но больше вопрос по предоставленной JohnSUN фишке
Код:
sViewData = ThisReport.GetCurrentController.GetViewData()
Я снова использовал глобальную для этого переменную. Верно ли это или можно как-то так:

Код:
Sub BeginUpdateRep
ThisReport.isUndoEnabled=False
if shtReport.isProtected() Then shtReport.unprotect(Pass)
ThisReport.lockControllers()
ThisReport.AddActionLock()
End Sub

Sub EndUpdateRep
ThisReport.RemoveActionLock()
ThisReport.UnlockControllers()
ThisReport.getCurrentController.RestoreViewData(ThisReport.GetCurrentController.GetViewData())
shtReport.protect(Pass)
ThisReport.isUndoEnabled=True
End Sub
Но это:
Код:
ThisReport.getCurrentController.RestoreViewData(ThisReport.GetCurrentController.GetViewData())
мне кажется какой-то бред
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #23: 5 Декабрь 2016, 15:36 »

Ну, почему сразу "бред"? "Есть много в программировании такого, друг Горацио, что и не снилось нашим" (с) кажется, Шекспир в переводе Аникста.
Иногда попадаются варианты с переприсвоением, которые на первый взгляд выглядят странно.
Например, такой оператор ThisField.Anchor.String = ThisField.Anchor.String

А у меня вопрос еще по процедурам BeginUpdateRep и EndUpdateRep код которых выше. Правильно ли последовательность вызовов в них
Ну, в принципе все верно - всё, что блокировалось и запрещалось, в нужный момент разрешается и разблокируется в обратном порядке...

Просто попробуй - если работает, значит некоторое время и дальше будет работать...
« Последнее редактирование: 5 Декабрь 2016, 15:57 от JohnSUN » Записан

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

Сообщений: 114


« Ответ #24: 5 Декабрь 2016, 15:50 »

Просто попробуй - если работает, значит некоторое время и дальше будет работать...
Успокоил Улыбка
Например, такой оператор ThisField.Anchor.String = ThisField.Anchor.String
На это я уже натыкался, может быть по этому у меня и возникло это: ThisReport.getCurrentController.RestoreViewData(ThisReport.GetCurrentController.GetViewData())

Т.е. предлагаете избавится от гоблинской переменной?)
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #25: 5 Декабрь 2016, 16:11 »

ThisReport.getCurrentController.RestoreViewData(ThisReport.GetCurrentController.GetViewData())
Т.е. предлагаете избавится от гоблинской переменной?)
Предлагаю попробовать три варианта: оставить переменную, избавиться от неё и закомментировать эту строку вообще. И сообщить народу результат. Чтоб знали.

А вот от точек в операторах лучше избавляйся. Могу рассказать старую легенду (или это был тост?) про методы и их вызовы. Но лучше просто поверь на слово: каждая точка - это лишний кусочек времени выполнения. Есть мнение, что тот же самый оператор, но записанный в две строки
Код:
oCurrentController = ThisReport.getCurrentController
oCurrentController.RestoreViewData(oCurrentController.GetViewData())
или в три строки
Код:
With ThisReport.getCurrentController
   .RestoreViewData(.GetViewData())
End With
или даже в пять строк
Код:
With ThisReport
   With .getCurrentController
      .RestoreViewData(.GetViewData())
   End With
End With
работает лучше оригинала. Врать не стану, этот конкретный пример не проверял, не до того сейчас, не уверен даже, что записано без ачепяток. Но когда-то давно ставил эксперименты на эту тему и убедился, что в этом предрассудке что-то кроется, не на пустом месте он появился
Записан

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

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


« Ответ #26: 5 Декабрь 2016, 16:34 »

А вот от точек в операторах лучше избавляйся.
+++
Код:
With ThisReport.getCurrentController
   .RestoreViewData(.GetViewData())
End With
В данном случае предпочтительно по сравнению с 5-строчным вариантом, поскольку невозможна неоднозначность при совпадении названий методов/свойств объектов ThisReport и getCurrentController, а эффективность одинаковая (однократный доступ к текущему контроллеру).
Записан

С уважением,
Михаил Каганский
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #27: 5 Декабрь 2016, 17:03 »

Ну да. Но пятистрочный вариант хорош для отладки - когда с сообщением "объект нот фаунд" бэйсик выделяет строку
With ThisReport.getCurrentController, у тебя два варианта: или getCurrentController вернул null-Nothing-Empty, или сам ThisReport не объект, а, скажем, число 3.62.
Записан

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

Сообщений: 114


« Ответ #28: 6 Декабрь 2016, 14:41 »

ThisComponent.calculate().
Спасибо Всё заработало как надо
Оказалось не совсем так. Не все формулы обновляются. Причем по F9 тоже самое, но если выделить ячейку с "кривым результатом" формулы и нажать F9 то ячейка пересчитывается как надо.
ThisComponent.calculateAll() - обновляет все, и в том числе что не нужно (Список на листе) Грустный так что он не подходит
Как это обойти?
Хотя как вариант после calculateAll восстановить список, но может есть еще решение - обновить все ячейки с формулами?
Записан
mikekaganski
Старожил
****
Offline Offline

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


« Ответ #29: 6 Декабрь 2016, 14:52 »

Не пробовал, но измышляю: попробуйте пройти по нужным (изменённым?) ячейкам и вызвать calculate() для них. Либо внутри, либо вне Begin/EndUpdateRep (надо поэкспериментировать).
Записан

С уважением,
Михаил Каганский
Страниц: « 1 2 3 4 »   Вверх
  Печать  
 
Перейти в:  

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