Excel-VBA перед сохранением Заблокируйте диапазон ячеек

Я создаю лист ежедневного планировщика, в котором я хочу заблокировать некоторые ячейки оценки после сохранения. Я написал следующий код в коде книги Excel. Макрос просит ввести пароль перед сохранением. Почему просит ввести пароль? (У меня 53 листа для планирования на неделю. Здесь я показал только 2)

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Sheets("Sheet18").Unprotect Password:="****"
Sheets("Sheet19").Unprotect Password:="****"
ActiveSheet.Protect Contents:=False
For Each Cell In Range("H5:H24,J5:J24")
If Cell <> "" Then Cell.Locked = True
If Cell = "" Then Cell.Locked = False
Next
ActiveSheet.Protect Contents:=True
Sheets("Sheet18").Protect Password:="****"
Sheets("Sheet18").Protect UserInterfaceOnly:=True
Sheets("Sheet19").Protect Password:="****"
Sheets("Sheet19").Protect UserInterfaceOnly:=True
End Sub

person user2564105    schedule 09.07.2013    source источник


Ответы (1)


Ваш код будет вести себя по-разному в зависимости от активного листа при сохранении.

Кроме того, я бы не рекомендовал перегружать зарезервированное имя «Cell» локальной переменной цикла. Это приведет к неожиданному поведению.

Вы должны удалить ссылки на ActiveSheet. Если вы хотите защитить всю книгу, я бы предложил итерацию по листам:

Sub ProtectAll()
    Dim wSheet As Worksheet
    Dim myCell As Range
    For Each wSheet In Worksheets
        wSheet.Unprotect Password:="****"
        For Each myCell In Range("H5:H24,J5:J24")
            myCell.Locked = (myCell <> "")
        Next myCell
        wSheet.Protect Contents:=True, Password:="****", UserInterfaceOnly:=True
    Next wSheet
End Sub

NB: вы должны поместить код в модуль кода.

person d-stroyer    schedule 09.07.2013
comment
Я только что обновил пример кода, чтобы показать, как его использовать. Если у вас есть ошибка во время выполнения, сообщите, пожалуйста, какой код ошибки и в какой строке... помощь идет в обе стороны. - person d-stroyer; 11.07.2013