Защита ячейки

Автор Alex16, 18 ноября 2016, 14:48

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

Alex16

Подскажите способ попроще установить/снять защиту ячейки. Я записал макрос, получилось куча строк:
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) ячеек нужно.

rami

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

economist

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


[A1:A100].Locked=true


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

А еще в модуле где-то должна быть строка  
ThisComponent.BasicLibraries.VBACompatibilityMode=true
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Alex16

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

Alex16

#4
Что-то не работает у меня вот это:
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


Код выполняется без ошибок, но галка "защищено" в диалоге "формат ячеек" не меняется
Код со сменой цвета выполняется (вставил для проверки)
Что-то не пойму что не так :(

rami

Цитата: Alex16 от 18 ноября 2016, 15:07Код выполняется без ошибок, но галка "защищено" в диалоге "формат ячеек" не меняется
Кажется, это глюк, а может так надо ??? ??? ??? Если ячейка пустая, то статус защиты не меняется, а если не пустая, то меняется

Alex16

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

Пришла мысль попробовать сделать так:
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

Цитата: Alex16 от 18 ноября 2016, 15:07Что-то не работает у меня вот это:

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

Alex16

Цитата: mikekaganski от 18 ноября 2016, 21:37присвоение производится временной переменной.
ЦитироватьoSheet.getCellRangeByName("A1:B2").CellProtection.IsLocked = false
Не совсем понятно и как-то странно :) Но в понедельник попробую Ваш вариант
        CellProtection = oSheet.getCellRangeByName("A1:B2").CellProtection
CellProtection.IsLocked = false
oSheet.getCellRangeByName("A1:B2").CellProtection = CellProtection

В любом случае Спасибо!

Alex16

Цитата: mikekaganski от 18 ноября 2016, 23:37
Надо так:
Да, как ни странно с временной переменной все заработало) Спасибо.

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

rami

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

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

#11
Цитата: rami от 21 ноября 2016, 13:30Bernard Marcelly на этот вопрос в 2014 году ответил так:
Понятно :( Спасибо.
На дворе уже почти 2017, а они..... они наверное забыли об этой "проблеме")

mikekaganski

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

JohnSUN

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

mikekaganski

Цитата: JohnSUN от 21 ноября 2016, 14:36Или я все-таки ошибаюсь?

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

Патч несложный, сложнее будет юниттест. Рабдень окончен, сейчас попробую сделать.
С уважением,
Михаил Каганский