Excel снимает защиту листа в скрипте BeforeClose, не работает при вызове ThisWorkbook.Close - PullRequest
0 голосов
/ 25 октября 2018

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

Когда я закрываю книгу с крестиком в верхнем углу, саб работает нормально.Когда я пытаюсь использовать ThisWorkbook.Close, подпункт фактически не снимает защиту листа, поэтому я получаю ошибку времени выполнения «1004», когда он пытается очистить значения ячеек.

Мне нужен метод .Close для работы с другим сценарием, который закроет книгу через некоторое время.

Перед сценарием закрытия

Private Sub Workbook_BeforeClose(Cancel As Boolean)

ThisWorkbook.Unprotect Password:=pw
For Each Worksheet In ThisWorkbook.Worksheets
    Worksheet.Protect Password:=pw
    If Worksheet.Name = "Control Tab" Then
        With Worksheet
            .Unprotect Password:=pw
            .Cells(24, 4).Value = ""
            .Cells(24, 5).Value = ""
            .Cells(24, 6).Value = ""
            .Cells(24, 7).Value = ""
            .Cells(24, 8).Value = ""
            .Cells(24, 9).Value = ""
            .Cells(24, 10).Value = ""
            .Cells(24, 11).Value = ""
            .Cells(24, 12).Value = ""
            .Cells(24, 13).Value = ""
            .Cells(24, 14).Value = ""
            .Cells(24, 15).Value = ""
            .Cells(24, 16).Value = ""
            .Protect Password:=pw
        End With
    Else
        Worksheet.Visible = 0
    End If
Next
ThisWorkbook.Protect Password:=pw

ThisWorkbook.Save
End Sub

Кнопка для закрытия книги(для тестирования)

Sub Button1_Click()
    ThisWorkbook.Close
End Sub

Я пытался найти причину, по которой может быть разница между проблемным и ручным закрытием книги в google и stackoverflow, но не нашел понимания, почемускрипт не снимает защиту листа.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 25 октября 2018

Во-первых, я бы не стал помещать этот код в Workbook_BeforeClose;Я бы вместо этого поместил его в Workbook_BeforeSave и использовал

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    if not thisworkbook.saved then _
        ThisWorkbook.Save

End Sub

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

Наконец, почему не защищена рабочая таблица вкладки «Управление»с аргументом UserInterfaceOnly: = True ?Это позволит вам вносить любые изменения, которые вы хотите, через VBA, не снимая защиту / не изменяя / не защищая эту конкретную рабочую таблицу, в то же время ограничивая пользователя.

Запустите этот один раз , а затем удалите все ссылки на VBA для снятия защиты /защитить лист «Вкладка управления» (если вы не хотите специально открывать его для пользователя).

sub RunOnce()
    with thisworkbook.worksheets("Control Tab")
        .Unprotect Password:=pw
        .Protect Password:=pw, UserInterfaceOnly:=True
    end with
end sub

Запустится любое кодирование VBA, которое влияет на рабочий лист вкладки управления. Предостережение: может быть некоторая закодированная модификация, которая требует Application.DisplayAlerts = False, если вы хотите вообще не отвлекать диалоги сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...