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

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

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

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

Сообщений: 1 678


« Ответ #15: 13 Октябрь 2011, 12:56 »

По ссылке нашёл такую штуку
Код:

Sub AddChartDataListener()
 oCell1 = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("Form")
 oListener = CreateUnoListener("MyApp_", "com.sun.star.chart.XChartDataChangeEventListener")
 oCell1.addChartDataChangeEventListener(oListener)
End Sub

Sub MyApp_chartDataChanged(oEvent)
 dCell = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("Form")
 MsgBox dCell.String 'dCell.Value
End Sub

Но тут вывод нового значения после изменения. А мне надо, чтобы отменить это изменение. Надеюсь понятно выражаюсь  Улыбка

Так?
Вместо
Код:
MsgBox dCell.String 'dCell.Value
Код:
ThisComponent.UndoManager.undo
?
Записан

ubuntu 12.04 + LibO3.6.0
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #16: 13 Октябрь 2011, 12:57 »

при закрытии документа сохраняем туда формулу. Потом XChartDataChangeEventListener при срабатывании копирует её в нужную ячейку.
Мысль забавная... Есть, конечно, и такие параметры. Но смысла в таком их использовании как-то маловато... Если восстанавливать формулу будем макросом, то почему бы её прямо в макросе и не сконструировать "с нуля"?

Регистрация XVetoableChangeListener требует указания параметра PropertyName типа String за которым он будет следить. Что мне туда указать, чтобы он следил и запрещал изменение/удаление формулы?
Еще не смотрел в ту сторону внимательно, но если включить логику... Нужно защитить формулу? Значит, скорее всего, следить нужно за параметром Formula для указанной Cell... Или для каждой из Cell в диапазоне.
Там-то, по идее должно быть не сложно - сравниваем OldValue с нашей формулой, если не она - пусть делают что хотят, а если она - по рукам, по рукам!  Смеющийся
Извиняюсь, но в OOBasic не шарю совсем, поэтому могу тупить Улыбка
Не парься. Не комплексуй. Каждый из нас когда-то тоже впервые увидел OpenOffice.org и его StarBasic... И точно так же обалдел от непривычного синтаксиса. Это дело наживное...

Так формулу-то покажешь?
Записан

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

Сообщений: 1 678


« Ответ #17: 13 Октябрь 2011, 13:07 »

а есть в OO подобие Wordовский variables, т.е. переменные, которые хранятся в самом документе.
В Writer есть (пользовательские переменные (доступны через диалог Поля)), а в Calc не знаю. Можно хранить данные в комментариях к ячейкам, к примеру.
Записан

ubuntu 12.04 + LibO3.6.0
Kopusha
Участник
**
Offline Offline

Сообщений: 13


« Ответ #18: 13 Октябрь 2011, 13:12 »

Так?
Код:
ThisComponent.UndoManager.undo
?
Мысль правильная, но тут фигня получается. Срабатывает и при изменении значения ячейки, входящей в формулу, и в ней отменяет введённое значение. После этого значение формулы опять меняется и обработчик срабатывает еще раз. Во всяком случае у меня так.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #19: 13 Октябрь 2011, 13:16 »

Покопался в архивах... Была у меня одна примочка, по смыслу похожая на эту задачу. (То-то я думаю, откуда из подкорки мысль про две кнопки всплыла!)

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

Глянь! Может это и есть решение твоей задачи?

[вложение удалено Администратором]
Записан

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

Сообщений: 13


« Ответ #20: 13 Октябрь 2011, 13:18 »

Формула в строке "Итого по". Будут вопросы - задавайте.

[вложение удалено Администратором]
Записан
Kopusha
Участник
**
Offline Offline

Сообщений: 13


« Ответ #21: 13 Октябрь 2011, 13:35 »

Можно и так, но тут для ввода данных используется форма. Надо еще организовать удаление строк. Слишком сложно всё получается, тут проще будет формулу ручками добавлять каждый раз или хранить её в комментах Улыбка
Записан
RFJ
Форумчанин
***
Offline Offline

Сообщений: 220


« Ответ #22: 13 Октябрь 2011, 13:42 »

хранить её в комментах
Хранить лучше на скрытом защищенном листе.
Записан

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

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


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


WWW
« Ответ #23: 13 Октябрь 2011, 13:48 »

Да брось, ломать не строить - удалить строчку можно и отдельной кнопкой: проверить что сейчас выделено (не шапка ли? не формула?) да и грохнуть её... Это не проблема. С другой стороны на форму можно навесить кучу дополнительных проверок, чтобы эти варвары при вводе данных пореже ошибались...

Не об этом речь.
Будут вопросы - задавайте.
Задаю.

1. Лист4 к текущей задаче не имеет отношения, случайно остался? Или где-то на него ссылки есть?
2. Как предполагалось работать с таблицей?

После вода всех данных в итоговой строке выбираем один из МО и, может быть, один из его УК.
3. Другие параметры (Адрес, Вид работы, Исполнитель) в фильтр идут? Или это на всякий случай?
4. Всегда интересует итог по одному из МО? Или вообще-то нужны суммы по каждому, но еще не дошли руки сделать?
5. Нижний колонтитул только у меня глючит? Первая страница считается нулевой...
Записан

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

Сообщений: 13


« Ответ #24: 13 Октябрь 2011, 14:09 »

1. Важны только листы 1 и 2, остальные - сами пользователи создали.
2. Либо один из МО, либо один из УК, либо и то и другое. Т.е. надо общий отчет - в ячейках пусто. Надо итог по МО или УК, вводишь нужное, выбираешь его в фильтре,печатаешь.
3. Делал все, так как вполне может понадобиться, но пользуются только МО и УК.
4. Не совсем понял. Итог будет по тому МО, которое введено в ячейку в строке "Итого по". Подробности работы в п.2. Если подразумевается, что итог по всем МО одновременно, то нет, сразу по всем не надо.
5. Колонтитулы фик с ними, особенно нижний.

Попробую объяснить принцип. Вводятся выполненные работы. Считается общий итог. Потом нужен отчет только по МО Небыловское. В строку Итого по вводим Небыловское. Считается сумма по МО Небыловское. В фильтре выбираем "небыловское", на листе остаются только работы по данному МО, печатаем этот отчёт. типа того.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #25: 13 Октябрь 2011, 14:28 »

1. Ну, Лист2 нужен пока мы используем DSUM. Если формулу изменим (а я думаю, мы это сделаем уже скоро), он тоже не понадобится.

"Продолжаем разговор..." (с) Карлсон

6. Эти гаврики сносят только итоги? Или подвал с подписями (Мишину и Савельеву) тоже удаляют?
7. Нет желания разнести лист для ввода данных и печатную форму по разным листам? Или даже по разным книгам? Или по разным программам? Я не прикалываюсь, просто прикидываю, а не задействовать ли Base? Отбор данных для отчетов - его прямая обязанность...
8. Разрывы в данных (пустые строки) что-то обозначают? Или это случайность?
9. Менять порядок строк можно или не желательно?
Записан

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

Сообщений: 13


« Ответ #26: 13 Октябрь 2011, 14:36 »

6. пока встречал только формулу итога.
7. просто в моём понятии отчет элементарен до невозможности, поэтому даже не задумывался об этом. с base что-то пробовал, но не подружился. не нашел, точнее, как пользователю разрешить только запуск нужной формы и ничего другого.
8. Разрывы - это личная инициатива для разделения видов работ.
9. Приходится иногда менять порядок для какой-никакой сортировки по алфавиту.

еще необходимо учесть, что пользователи - женщины 55-60 лет. Этому еле научил
Записан
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #27: 13 Октябрь 2011, 14:39 »

Мысль правильная, но тут фигня получается. Срабатывает и при изменении значения ячейки, входящей в формулу, и в ней отменяет введённое значение. После этого значение формулы опять меняется и обработчик срабатывает еще раз. Во всяком случае у меня так.
Тогда можно заменить эту строчку на
Код:
if dCell.Formula="=SUM..." then exit Sub else dCell.Formula="=SUM..."
Записан

ubuntu 12.04 + LibO3.6.0
Kopusha
Участник
**
Offline Offline

Сообщений: 13


« Ответ #28: 13 Октябрь 2011, 14:46 »

Тогда можно заменить эту строчку на
Код:
if dCell.Formula="=SUM..." then exit Sub else dCell.Formula="=SUM..."
Начнёт врать при добавлении/удалении строк
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #29: 13 Октябрь 2011, 15:39 »

6. пока встречал только формулу итога.
Уверяю тебя, это не единственный возможный вариант. Например, если в K88 из твоего образца вставить
Код:
=SUMPRODUCT(K$2:K87;$B2:$B87=$B88;$C$2:$C87=$C88)
то это тоже будет "сумма всех чисел в столбце K, для которых MO=$B88 и УК=$C88"... Ясен пень, что работать она будет только если выбраны (заполнены) и тот и другой параметры, а у тебя они могут оставаться пустыми. Но это не важно, это только для примера.
7. просто в моём понятии отчет элементарен до невозможности, поэтому даже не задумывался об этом. с base что-то пробовал, но не подружился. не нашел, точнее, как пользователю разрешить только запуск нужной формы и ничего другого.
Там какой прикол - пользователь даже не будет знать о том, что Base каким-то боком участвует в печати отчета. Создаем базу данных, в качестве источника данных указываем лист из Калковской книги. Результат параметрического запроса размещаем на листе другой книги и дописываем к нему формулы суммирования, подписи и прочие украшательства. Об этой книге, которая для печати, не знает никто кроме исполнителя. И только она знает, что нужно открыть книгу, выбрать Данные-Обновить диапазон, ввести значения параметров (Base спросит) МО и УК и отправить на печать. То есть тетенька видит только Калк, Base втихаря шуршит на заднем плане.
8. Разрывы - это личная инициатива для разделения видов работ.
То есть, если их в печатной форме не будет, то это хорошо?

еще необходимо учесть, что пользователи - женщины 55-60 лет. Этому еле научил
Мои соболезнования... Знаю, что в такой ситуации проще сделать самому, чем "стопятьдесяттысячраз" объяснять всё с самого начала...

Вообще-то такой отчет можно замутить на одних Калковских формулах, вообще без макросов. Но раз уж ты эту тему поднял в бэйсике, предлагаю сделать такое:
1. Убираем подписи, формулы расчета итогов и колонку №п/п с Лист1 и переименовываем его в Данные.
2. На скрытом листе, как и предлагал RFJ, сохраняем заготовку ОДНОЙ строки итогов и подписей.
3. На открытом, но защищенном листе, оставляем две незащищенных ячейки для ввода МО и УК для отчета. Сам лист форматируем как для печати.
4. При запуске макроса считываем значения тех двух ячеек, снимаем защиту с листа и очищаем данные (числа и строки, но не форматы) для всех ячеек ниже заголовка.
5. Получаем лист Данные (oSheets.getByName("Данные")), для него определяем последнюю заполненную ячейку.
6. Слизываем в массив все данные со второй строки по последнюю (getDataArray()).
7. Пробегаемся по полученному "массиву массивов" в цикле, сравниваем с критериями отбора и перепаковываем в новый "массив массивов", дополняя номерами по порядку.
8. Одним махом сбрасываем данные в уже отформатированный лист отчета.
9. Копируем подвал со строкой формул в стык к отобранным данным.
10. Переопределяем диапазон печати, восстанавливаем защиту листа...

Как-то так, в общем
Записан

Владислав Орлов aka 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!