Защита листов останавливает работу макроса - PullRequest
0 голосов
/ 16 мая 2019

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

У меня есть несколько кнопок, которые я поместил на ленте моего листа Excel. Они прикреплены к макросам, которые копируют листы на другой лист, например

Макрос запускается нажатием кнопки:

Sub btnSheet1_onAction(control As IRibbonControl)

    mFunction.CopySheet1toSheet2

End Sub

Макрос содержится в моем модуле mFunction как:

Public Sub CopySheet1toSheet2()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
ws.Cells.Copy Destination:=ThisWorkbook.Sheets(2).Cells

End Sub

Теперь .... Мне нужно защитить элементы / ячейки на листах 1 и 2. Когда я защищаю листы, макросы приводят к аварийному завершению Excel - без ошибок времени выполнения или чего-либо еще.

Я вставил следующий код в 'ThisWorkbook'

Private Sub Workbook_Open()

Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True

End Sub

Но это все равно не работает - я также попытался использовать следующий код в модуле mFunction

Public Sub CopySheet1toSheet2()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

ws.Unprotect Password = "secret"
ws.Cells.Copy Destination:=ThisWorkbook.Sheets(2).Cells
ws.Protect Password = "secret"

End Sub

Но, похоже, это тоже не работает - я полагаю, это может быть связано с тем, что макрос копирует лист на другой лист, который также заблокирован?

Следует также отметить, что в рабочей книге есть другие листы, которые защищены, но к которым не прикреплены макросы, поэтому они остаются защищенными. Может ли это быть причиной проблемы?

Некоторая помощь будет принята с благодарностью !!

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

UserInterFaceOnly

Когда вы сохраняете рабочую книгу с листами, которые были защищены с помощью UserInterFaceOnly, это свойство удаляется в сохраняемом файле. Таким образом, при повторном открытии файла листы останутся защищенными, но также не могут быть изменены программно.

Итак, что касается этого фрагмента кода, который, на первый взгляд, делает именно то, что вам нужно:

Private Sub Workbook_Open()

Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True

End Sub

.. если вы сохраните и снова откроете свой файл, то при запуске вышеупомянутого Workbook_Open() защита не будет установлена, поскольку защита уже установлена.

Обходной путь должен включать строки для каждого листа, которые сначала снимают любую защиту. Затем вы можете установить его снова правильно - например, так:

Private Sub Workbook_Open()

    Sheets(1).Unprotect Password:="secret"
    Sheets(2).Unprotect Password:="secret"
    Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
    Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True

End Sub

Это должно позволить вашему копируемому коду работать без проблем, так как я не вижу ничего плохого в этой части.


Кстати, если ваши пароли совпадают, вы можете немного привести их в порядок:

Private Sub Workbook_Open()

    Dim sh As Worksheet

    For Each sh In Array(Sheets(1), Sheets(2))
        sh.Unprotect Password:="secret"
        sh.Protect Password:="secret", UserInterFaceOnly:=True
    Next

End Sub
0 голосов
/ 16 мая 2019

Хорошо, поэтому я использовал это как обходной путь, но если кто-нибудь может дать более красноречивое решение, которое было бы замечательно:

Dim ws As Worksheet
Set ws1 = ThisWorkbook.Worksheets(1)
Set ws2 = ThisWorkbook.Worksheets(2)

ws1.Unprotect ("2402")
ws2.Unprotect ("2402")
ws1.Cells.Copy Destination:=ws2.Cells
ws1.Protect ("2402")
ws2.Protect ("2402")
...