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

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

22 Октябрь 2017, 18:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Сообщений: 114


« Стартовое сообщение: 18 Ноябрь 2016, 14:48 »

Подскажите способ попроще установить/снять защиту ячейки. Я записал макрос, получилось куча строк:
Код:
dim args2(3) as new com.sun.star.beans.PropertyValue
[b]args2(0).Name = "Protection.Locked"
args2(0).Value = false[/b]
args2(1).Name = "Protection.FormulasHidden"
args2(1).Value = false
args2(2).Name = "Protection.Hidden"
args2(2).Value = false
args2(3).Name = "Protection.HiddenInPrintout"
args2(3).Value = false

dispatcher.executeDispatch(document, ".uno:Protection", "", 0, args2())

Точнее даже не ячейки, а группе (Range) ячеек нужно.
« Последнее редактирование: 18 Ноябрь 2016, 14:52 от Alex16 » Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 18 Ноябрь 2016, 15:23 »

У ячейки или диапазона есть свойство CellProtection, и в нём IsLocked, IsFormulaHidden, IsHidden и IsPrintHidden
Код:
oCell.CellProtection.IsLocked=true
Включить или выключить защиту листа:
Код:
Sub Main
oSheet=ThisComponent.Sheets(0)
oSheet.protect("пароль")
oSheet.unprotect("пароль")
End Sub
Записан

economist
Ветеран
*****
Offline Offline

Сообщений: 715


« Ответ #2: 18 Ноябрь 2016, 15:55 »

Если нужно максимально кратко, то вот так:

Код:
[A1:A100].Locked=true

Т.к. это VBA-код, вначале модуля StarBasic должны быть вот эти строки:
Option VBASupport 1
Option Compatible

А еще в модуле где-то должна быть строка  
ThisComponent.BasicLibraries.VBACompatibilityMode=true
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #3: 18 Ноябрь 2016, 16:44 »

Спасибо всем.
Включить или выключить защиту листа:
Вот этот код я уже где то нарыл, но у меня по нему вдогонку вопрос.
Если это делать штатно: меню Сервис->Защитить лист.... Там в диалоге есть два флажка, можно как-то ими управлять?
В частности нужно снять галку с "Выбирать защищенные ячейки"
Записан
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


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

Что-то не работает у меня вот это:
Код:
sub ProtectCells
oSheet=ThisComponent.Sheets(0)
if oSheet.isProtected() Then  oSheet.unprotect(1)
oSheet.getCellRangeByName("A1:B2").CellProtection.IsLocked = false 'true
oSheet.getCellRangeByName("A1:B2").CellBackColor = RGB(RND * 255, RND * 255, RND * 255)
oSheet.getCellByPosition(0,0).CellProtection.IsLocked = false 'true
oSheet.getCellByPosition(0,0).CellBackColor = RGB(RND * 255, RND * 255, RND * 255)
oSheet.protect(1)
end sub

Код выполняется без ошибок, но галка "защищено" в диалоге "формат ячеек" не меняется
Код со сменой цвета выполняется (вставил для проверки)
Что-то не пойму что не так Грустный
« Последнее редактирование: 18 Ноябрь 2016, 17:21 от Alex16 » Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #5: 18 Ноябрь 2016, 18:13 »

Код выполняется без ошибок, но галка "защищено" в диалоге "формат ячеек" не меняется
Кажется, это глюк, а может так надо Непонимающий Непонимающий Непонимающий Если ячейка пустая, то статус защиты не меняется, а если не пустая, то меняется
Записан

Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #6: 18 Ноябрь 2016, 22:51 »

Если ячейка пустая, то статус защиты не меняется, а если не пустая, то меняется
У меня по моему вообще не меняется, ни в пустой, ни с данными.... Но, теперь проверю только в понедельник.

Пришла мысль попробовать сделать так:
Код:
Sub ChangeProtectRange (oRange as Range, IsLock as boolean)

    dim args2(3) as new com.sun.star.beans.PropertyValue
    args2(0).Name = "Protection.Locked"
    args2(0).Value = IsLock
    args2(1).Name = "Protection.FormulasHidden"
    args2(1).Value = false
    args2(2).Name = "Protection.Hidden"
    args2(2).Value = false
    args2(3).Name = "Protection.HiddenInPrintout"
    args2(3).Value = false
    dispatcher.executeDispatch(document, ".uno:Protection", "", 0, args2())

End Sub

Вызов
Код:
ChangeProtectRange (oSheet.GetRangeByName("A1:B2"), True)
Ну что-то в этом духе.... Только надо как-то задействовать внутри oRange, ну и о других параметрах позаботится...
Как такая мысль?
Записан
mikekaganski
Ветеран
*****
Offline Offline

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


« Ответ #7: 18 Ноябрь 2016, 23:37 »

Что-то не работает у меня вот это:

там получается так: при вызове
Код:
oSheet.getCellRangeByName("A1:B2").CellProtection.IsLocked = false
присвоение прроизводится временной переменной.
Надо так:
Код:
CellProtection = oSheet.getCellRangeByName("A1:B2").CellProtection
CellProtection.IsLocked = false
oSheet.getCellRangeByName("A1:B2").CellProtection = CellProtection
Записан

С уважением,
Михаил Каганский
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #8: 19 Ноябрь 2016, 00:05 »

присвоение производится временной переменной.
Цитата:
oSheet.getCellRangeByName("A1:B2").CellProtection.IsLocked = false
Не совсем понятно и как-то странно Улыбка Но в понедельник попробую Ваш вариант
Код:
        CellProtection = oSheet.getCellRangeByName("A1:B2").CellProtection
CellProtection.IsLocked = false
oSheet.getCellRangeByName("A1:B2").CellProtection = CellProtection
В любом случае Спасибо!
Записан
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #9: 21 Ноябрь 2016, 10:24 »

Надо так:
Да, как ни странно с временной переменной все заработало) Спасибо.

Но у меня все еще остался вопрос:
Цитата:
Если это делать штатно: меню Сервис->Защитить лист.... Там в диалоге есть два флажка, можно как-то ими управлять?
В частности нужно снять галку с "Выбирать защищенные ячейки"
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #10: 21 Ноябрь 2016, 15:30 »

Если это делать штатно: меню Сервис->Защитить лист.... Там в диалоге есть два флажка, можно как-то ими управлять?
В частности нужно снять галку с "Выбирать защищенные ячейки"
Мне не удалось найти.

Bernard Marcelly на этот вопрос в 2014 году ответил так:
The "Select locked cells, Select unlocked cells" items have not been added in the help pages descriptions of sheet protection.
I could not find the equivalent in API (nothing in the IDL description, nothing using Xray).

In my opinion, this is a not finished, not debugged, not documented feature. No wonder the API aspect is missing.
Записан

Alex16
Постоялец
***
Offline Offline

Сообщений: 114


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

Bernard Marcelly на этот вопрос в 2014 году ответил так:
Понятно Грустный Спасибо.
На дворе уже почти 2017, а они..... они наверное забыли об этой "проблеме")
« Последнее редактирование: 21 Ноябрь 2016, 16:42 от Alex16 » Записан
mikekaganski
Ветеран
*****
Offline Offline

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


« Ответ #12: 21 Ноябрь 2016, 16:34 »

хм... кто они?
если про то, что опция не сохраняется, то в ЛО она сохраняется начиная с 4.4
а если про то, что нет API - то где багрепорт, чтобы кто-то о чём-то помнил?
Записан

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

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


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


WWW
« Ответ #13: 21 Ноябрь 2016, 16:36 »

А это проблема? Я, конечно, могу ошибаться, но если опция недоступна из API, то и изменить её из Baic'а нельзя, логично? То есть, вызовы protect/unprotect должны бы, по идее, оставлять указанное вручную значение нетронутым. И значит - что? Защищаем лист вручную так, как надо и забываем о проблеме... Или я все-таки ошибаюсь?
Записан

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

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


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

Или я все-таки ошибаюсь?

К сожалению да.
Ваш вариант должен работать, но реализован не так. См. http://opengrok.libreoffice.org/xref/core/sc/source/ui/docshell/docfunc.cxx#3780

Патч несложный, сложнее будет юниттест. Рабдень окончен, сейчас попробую сделать.
Записан

С уважением,
Михаил Каганский
Страниц: 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!