Запрет изменения содержимого ячейки

Автор Kopusha, 12 октября 2011, 16:31

0 Пользователи и 1 гость просматривают эту тему.

Рыбка Рио

Цитата: Kopusha от 13 октября 2011, 08:03По ссылке нашёл такую штуку
Код:

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

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

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

Так формулу-то покажешь?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Рыбка Рио

Цитата: Kopusha от 13 октября 2011, 12:36а есть в OO подобие Wordовский variables, т.е. переменные, которые хранятся в самом документе.
В Writer есть (пользовательские переменные (доступны через диалог Поля)), а в Calc не знаю. Можно хранить данные в комментариях к ячейкам, к примеру.
ubuntu 12.04 + LibO3.6.0

Kopusha

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

JohnSUN

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

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

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

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

Kopusha

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

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

Kopusha

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

RFJ

Цитата: Kopusha от 13 октября 2011, 13:35хранить её в комментах
Хранить лучше на скрытом защищенном листе.

JohnSUN

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

Не об этом речь.
Цитата: Kopusha от 13 октября 2011, 14:18
Будут вопросы - задавайте.
Задаю.

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

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

Kopusha

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

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

JohnSUN

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

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

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

Kopusha

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

еще необходимо учесть, что пользователи - женщины 55-60 лет. Этому еле научил

Рыбка Рио

Цитата: Kopusha от 13 октября 2011, 13:12Мысль правильная, но тут фигня получается. Срабатывает и при изменении значения ячейки, входящей в формулу, и в ней отменяет введённое значение. После этого значение формулы опять меняется и обработчик срабатывает еще раз. Во всяком случае у меня так.
Тогда можно заменить эту строчку на
if dCell.Formula="=SUM..." then exit Sub else dCell.Formula="=SUM..."
ubuntu 12.04 + LibO3.6.0

Kopusha

Цитата: Клио от 13 октября 2011, 14:39Тогда можно заменить эту строчку на
Код:
if dCell.Formula="=SUM..." then exit Sub else dCell.Formula="=SUM..."
Начнёт врать при добавлении/удалении строк

JohnSUN

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

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

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

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