Регулярно используйте для каждой петли рабочего листа, чтобы снять защиту со всех рабочих листов в рабочей книге, хотя бы вместо этого измените активный рабочий лист, чтобы сохранить текущий.
Такое поведение распознается только в Office2016, а обычный запуск выполняется с помощью кнопки. Если вы начинаете с Makro, с помощью окна Event или Immediate, оно работает нормально, и ActiveWorksheet остается без изменений.
Если вы поставите метку остановки отладки в подпрограмму, она также будет хорошо запускаться командой.
Такое поведение распознается только незащищенной функцией. Защитите функцию, напечатайте имена рабочих листов или то, что когда-либо работает нормально, используя для каждого цикла рабочего листа.
Важно сохранить ActiveWorksheet.
Функция отлично работает в течение нескольких лет Office2010.
Эта проблема возникает после изменения Office2016. И теперь у нас есть один лист, функция вызывается кнопкой команды, а не событием, и мы впервые обнаружили проблему.
Изменить функцию не так просто, потому что она используется в проверенной среде
For Each ws In ActiveWorkbook.Worksheets
If ws.ProtectContents = True Then
ws.Unprotect Password:=GetPassword()
End If
Next ws
этот код будет хранить ActiveWorksheet, например:
(вызывается кнопкой команды)
For Each ws In ActiveWorkbook.Worksheets
If ws.ProtectContents = False Then
ws.Protect Password:=GetPassword()
End If
Next ws
Что мне нужно сделать, чтобы сохранить ActiveWorksheet?
'code to reproduce the issue
'declaration zone
Public Const GLB_PW = "Password"
'Module 1
Sub Protection_On() 'called by command button
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If Not ws.ProtectContents Then
'ws.Protect GLB_PW '
ws.Protect Password:=""
End If
Next ws
Debug.Print "Aktive Worksheet: " & ActiveSheet.Name
End Sub
Sub Protection_Off() 'called by command button
'code generating the issue
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.ProtectContents Then
'ws.Unprotect GLB_PW
ws.Unprotect Password:=""
End If
Next ws
Debug.Print "Aktive Worksheet: " & ActiveSheet.Name
'ActiveSheet moved from Sheet1 to Sheet3
End Sub