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

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

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

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Макрос по разному работает при разных способах запуск?...  (Прочитано 624 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ForumOOo (бот)
Ветеран
*****
Offline Offline

Сообщений: 574


« Стартовое сообщение: 19 Декабрь 2016, 16:24 »

Компонент: Basic
Версия продукта: 5.x
Сборка: LibreOffice
ОС: Windows 7 x64

Макрос по разному работает при разных способах запуска.
Есть функция, которая должна выполняться при изменении числа в определенной ячейке.
В функции есть вызов метода clearContents.
Если вызов функции выполняется автоматически (т.е. при изменении значения определенной ячейки), метод clearContents не отрабатывает.
Если функцию вызывать из редактора VB (клавишей F5) clearContents отрабатывает.
Не могу понять, в чем дело
демо прикладываю. В демо файле при изменении значения в ячейке B1 должен стираться диапазон B10:B20 и значение B1 копироваться в C1.

Тестовый файл: http://forumooo.ru/attachments/upload/test1.ods (10.57 КБ)

--
Подпись: Lesha
Эл. почта: rageforge@yandex.ru
Записан
mikekaganski
Старожил
****
Offline Offline

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


« Ответ #1: 19 Декабрь 2016, 16:40 »

Это не макрос, а пользовательская функция, и вы её не запускаете, а вычисляете значение. При этом она работает на наборе данных "для чтения", то есть не может ничего изменить на листе (у неё нет побочного действия).
Записан

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

Сообщений: 3


« Ответ #2: 19 Декабрь 2016, 16:59 »

не совсем понимаю, о чем речь... а изменить на листе очень даже может
если я добавлю в эту функцию строку типа "cSheet.getCellByPosition(5, 5).Value = d*d" она отработает
Записан
mikekaganski
Старожил
****
Offline Offline

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


« Ответ #3: 19 Декабрь 2016, 17:04 »

Хм... действительно. Но вот "cSheet.getCellByPosition(1, 1).Value = d*d" уже не работает. Так что это, видимо, говорит о том, что ячейки "выше" (раньше с точки зрения отработки) не получится изменить..... я бы назвал это багом. Не должна такая вещь работать вообще.
« Последнее редактирование: 19 Декабрь 2016, 17:11 от mikekaganski » Записан

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

Сообщений: 3


« Ответ #4: 19 Декабрь 2016, 17:12 »

у меня работает и "cSheet.getCellByPosition(1, 1).Value = d*d".
LibreOffice 5.1.6.2
почему не должно работать?
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


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

не совсем понимаю, о чем речь... а изменить на листе очень даже может
если я добавлю в эту функцию строку...
Более того, она, как и планировалось, нормально очистит диапазон B10:B20 на ПЕРВОМ листе книги, если вписать =CLRDATA(<какая-то ячейка>) в ЛЮБОЙ ДРУГОЙ лист.
При вычислении функций, записанных в ячейки, содержимое ТЕКУЩЕГО листа (на котором эта функция находится) защищается от любых изменений. Иначе сплошь и рядом плохие формулы наглухо зацикливали бы вычисления и "вешали" или "валили" офис.

То что вариант с cSheet.getCellByPosition(5, 5).Value = d*d работает можно считать недоработкой, упущением. Попробуй указать =CLRDATA(F6) и пересчитать лист несколько раз (F6 это и есть CellByPosition(5, 5)). Вряд ли пользователи Calc ожидают таких результатов
Записан

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

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


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


WWW
« Ответ #6: 19 Декабрь 2016, 17:34 »

я бы назвал это багом. Не должна такая вещь работать вообще.
И, похоже, давний баг - воспроизводится и в LibreOffice 4.4.6. (в OpenOffice 4.1.2 еще всё нормально, лист блокируется). Но в багзилле ничего такого не вижу.
Ну, что, Lesha? Спасибо тебе! С твоей помощью сообщество избавится от досадного бага
Записан

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

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #7: 19 Декабрь 2016, 17:55 »

И, похоже, давний баг - воспроизводится и в LibreOffice 4.4.6. (в OpenOffice 4.1.2 еще всё нормально, лист блокируется).
Баг не только древний, но и коварный, если в Apache OpenOffice 4.1.3 выполнить:
Код:
public function clrdata(byval d as integer) as integer
dim cSheet as Object
cSheet = ThisComponent.Sheets(0)
cSheet.getCellRangeByName("A1").value=d*d
clrdata = d
end function
то в ячейке A1 ничего не происходит, (проверял содержимое ячейки), но после сохранения и открытия в OOA или в LO появляется новое значение (d*d)

JohnSUN, проверь ещё раз с сохранением.
Записан

mikekaganski
Старожил
****
Offline Offline

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


« Ответ #8: 19 Декабрь 2016, 18:05 »

Я проконсультировался у moggi - одного из ключевых разработчиков Calc.
Он говорит, что блокировки нет:
Код:
[17:21] mkaganski: moggi: is it OK that a user function in Calc is able to modify the sheet's content as side effect?
[17:21] moggi: mkaganski: normally not, ideally sheet functions are pure functions
[17:22] moggi: mkaganski: of course that does not prevent a user to write a function in basic that does not follow that rule
[17:46] mkaganski: moggi: so there's no read-only blocking when a user function is executed?
[17:47] moggi: mkaganski: no
[17:48] moggi: mkaganski: the whole calc core is blocking free, but you can most likely mess up the calculation engine if you change the wrong cell
[17:48] moggi: mkaganski: e.g. running into infinite loops, ...
[17:49] mkaganski: moggi: I understand. My question is because in such a function, "cSheet.getCellByPosition(5, 5).clearContents(511)" is a noop, while "cSheet.getCellByPosition(5, 5).Value = 5" works...
[17:50] mkaganski: moggi: and I hoped that allowing setting value is a bug
[17:53] moggi: mkaganski: as I mentioned you can most likely confuse calc a lot if you modify another cell while we are in the calculation of another cell

Зная, как вносятся изменения в ядро calc, этот баг не будет исправлен. Потому что уменьшение производительности в ядре - не вариант. Кстати, вероятно, и в случае с clearContents модификация может проявиться после сохранения/переоткрытия, и это один из видов того самого странного поведения, о котором говорит moggi. Единственное, что можно сказать - это не делайте так!
Записан

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

Сообщений: 3


« Ответ #9: 19 Декабрь 2016, 18:16 »

спасибо за консультацию.
не буду так делать))
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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