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

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

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

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Событие изменения данных в ячейке Calc  (Прочитано 8277 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Стартовое сообщение: 11 Ноябрь 2016, 16:49 »

Доброе время суток!
Как отловить событие подтверждения данных в ячейке? Например ввели что-то в ячейку и либо нажали ентер или стрелку или мышкой кликнули по другой ячейке. Или нажали Del в ячейке.
Как отловить этот момент и выполнить макрос в котором получить данные измененной ячейки?
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #1: 11 Ноябрь 2016, 16:54 »

Как отловить этот момент и выполнить макрос в котором получить данные измененной ячейки?
А что, Данные —> Проверка... не подходит?


* Проверка.png (54.04 Кб, 623x466 - просмотрено 254 раз.)
Записан

Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #2: 11 Ноябрь 2016, 17:02 »

А что, Данные —> Проверка... не подходит?
Незнаю. Есть много таких ячеек где нужно это делать. Но это не главное. А вот в макросе можно в этой проверке получить данные ячейки и ее координаты. т.е. Cell.Col и Cell.Row?

И это только при ошибке? Мне нужно всегда...
« Последнее редактирование: 11 Ноябрь 2016, 17:04 от Alex16 » Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #3: 11 Ноябрь 2016, 17:12 »

А что, Данные —> Проверка... не подходит?
Незнаю. Есть много таких ячеек где нужно это делать. Но это не главное. А вот в макросе можно в этой проверке получить данные ячейки и ее координаты. т.е. Cell.Col и Cell.Row?

И это только при ошибке? Мне нужно всегда...
Во-первых "ошибку" можно сделать "всегда" Смеющийся — любой ввод будет "ошибкой" запускающей макрос.

Но можно назначить событие листа — нужно щёлкнуть по ярлычку листа и вызвать контекстное меню, см. снимок:


* События листа.png (42.32 Кб, 605x252 - просмотрено 213 раз.)
Записан

Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #4: 11 Ноябрь 2016, 17:18 »

Но можно назначить событие листа — нужно щёлкнуть по ярлычку листа и вызвать контекстное меню
Ок. Попробую этот вариант. Но пока вопрос остается: как в макросе получить изменившуюся ячейку? ...ее адрес и содержимое
Записан
Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #5: 11 Ноябрь 2016, 17:23 »

Вроде вот так ChangedItem = ThisComponent.CurrentSelection
Верно?
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #6: 11 Ноябрь 2016, 17:29 »

Но пока вопрос остается: как в макросе получить изменившуюся ячейку? ...ее адрес и содержимое
Создайте макрос и назначьте  на нужное событие:
Код:
Sub Main(oEvent)

End Sub
Событие запускает макрос и передаёт ему параметр oEvent, который содержит информацию (переменную объекта вызвавшего макрос) иногда и другие параметры.
Записан

Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #7: 11 Ноябрь 2016, 17:32 »

Ок. Спасибо большое.
Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #8: 11 Ноябрь 2016, 17:44 »

Только учтите, что события листа относятся ко всему листу (к каждой его ячейке), иногда нужно проверять источник события (например, если ячейка не из нужного диапазона) и "принимать соответствующие меры".
Записан

Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #9: 14 Ноябрь 2016, 09:14 »

Sub Main(oEvent)

End Sub
А как в макросе определить на ячейку ссылается oEvent или на диапазон?
Макрос:
Код:
Sub Main(oEvent)
xray oEvent
End Sub
при изменении ячейки показывает ScCellObj а если выделить группу то - ScCellRangesObj

Или можно всегда обращаться к ячейке как к диапазону.

   print oEvent.RangeAddress.StartRow
   print oEvent.RangeAddress.EndRow
   print oEvent.RangeAddress.StartColumn
   print oEvent.RangeAddress.EndColumn

Но в таком варианте, если выделить несколько ячеек с ctrl'ом то вот такая ошибка "Свойство или метод не найдены: RangeAddress."
Как узнать что выделение "множественное"?
« Последнее редактирование: 14 Ноябрь 2016, 09:51 от Alex16 » Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #10: 14 Ноябрь 2016, 10:29 »

Нужно проверить свойство ImplementationName
Код:
If oEvent.ImplementationName="ScCellRangeObj" Then Exit Sub   'если не нужно обрабатывать диапазоны

Для "попадания" в нужную ячейку, столбец, строку или диапазон нужно проверять CellAddress (если CellAddress <> или = тому, что нужно)
Записан

Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #11: 14 Ноябрь 2016, 10:39 »

'если не нужно обрабатывать диапазоны
"Нормальный" диапазон я могу обработать
Код:
Sub MainChangeList(oEvent)
For R = oEvent.RangeAddress.StartRow to oEvent.RangeAddress.EndRow
  For C = oEvent.RangeAddress.StartColumn to oEvent.RangeAddress.EndColumn
    Print "Addr: (" & R & "," & C & ")"
  Next C
Next R 
End Sub
, а вот если с контролом ячейки выделять - пока не соображу как.
В любом случае спасибо за
If oEvent.ImplementationName="ScCellRangeObj" Then Exit Sub
Но в данном случае что с контролом, что обычный диапазон он - ScCellRangesObj или я не прав?
« Последнее редактирование: 14 Ноябрь 2016, 10:42 от Alex16 » Записан
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #12: 14 Ноябрь 2016, 12:45 »

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

Но в данном случае что с контролом, что обычный диапазон он - ScCellRangesObj или я не прав?
Для диапазона ячеек всегда ImplementationName="ScCellRangeObj"
« Последнее редактирование: 14 Ноябрь 2016, 12:47 от rami » Записан

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

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


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


WWW
« Ответ #13: 14 Ноябрь 2016, 13:49 »

Пишите подробней, что за "контрол" и с чем его едят Непонимающий
Брось, его не едят, его зажимают пока мышкой по ячейкам елозят - множественное выделение, не связанные диапазоны ячеек - тот самый третий случай, который муторнее всего обрабатывать: перебрать все диапазоны, попавшие в выделение, в каждом перебрать все ячейки, каждую ячейку обработать... Обычно мы с этой бедой старались не связываться - выделено больше одной ячейки и сразу Exit Sub

Для диапазона ячеек всегда ImplementationName="ScCellRangeObj"
И еще раз, для не очень внимательных читателей - есть ScCellObj  (одна ячейка), есть ScCellRangeObj (один диапазон) и есть ScCellRangesObj (несколько диапазонов). Разница между двумя последними - буква s

PS. Alex16, ещё раз перечитал с первого сообщения - похоже, ты не то событие для макроса выбрал. Тебе не выделение нужно обрабатывать, а изменение содержимого. Во втором случае довольно сложно получить ScCellRangesObj - нужно очень исхитриться, чтобы за один раз изменить содержимое несвязных диапазонов
« Последнее редактирование: 14 Ноябрь 2016, 13:53 от JohnSUN » Записан

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

Сообщений: 114


« Ответ #14: 14 Ноябрь 2016, 14:04 »

Тебе не выделение нужно обрабатывать, а изменение содержимого.
Так я его и обрабатываю.
довольно сложно получить ScCellRangesObj - нужно очень исхитриться, чтобы за один раз изменить содержимое несвязных диапазонов
Очень НЕ сложно Улыбка Достаточно выбрать несколько ячеек с Контролом и затем нажать Del
есть ScCellRangeObj (один диапазон) и есть ScCellRangesObj (несколько диапазонов). Разница между двумя последними - буква s
Если это так просто - то мне этого будет достаточно Улыбка Если без "s" - то обрабатываем, если "множественное выделение" то выдать предупреждение и выход из процедуры.
Спасибо за помощь. Сейчас проверю на предмет "ScCellRangeObj (один диапазон) и есть ScCellRangesObj (несколько диапазонов)"

ЗЫЖ Получился тестовый макрос примерно такой:
Код:
Sub MainChangeList(oEvent)
If oEvent.ImplementationName="ScCellRangesObj" Then
 msgbox "Множественное выделение не поддерживается, будет сделана обработка для всего отчета"
 Exit Sub
endif
For R = oEvent.RangeAddress.StartRow to oEvent.RangeAddress.EndRow
 For C = oEvent.RangeAddress.StartColumn to oEvent.RangeAddress.EndColumn
   Print "Addr: (" & R & "," & C & ")"
 Next C
Next R  
End Sub

Только есть еще один неприятный момент. Если мышкой перетащить(переместить) содержимое ячейки в другое место событие вообще не возникает.
« Последнее редактирование: 14 Ноябрь 2016, 14:16 от Alex16 » Записан
Страниц: 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!