Потерянный ActiveWorksheet после цикла «для каждого рабочего листа» - PullRequest
0 голосов
/ 25 марта 2019

Регулярно используйте для каждой петли рабочего листа, чтобы снять защиту со всех рабочих листов в рабочей книге, хотя бы вместо этого измените активный рабочий лист, чтобы сохранить текущий. Такое поведение распознается только в 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

1 Ответ

0 голосов
/ 25 марта 2019

На самом деле код не должен менять активный лист вообще. Но вы можете запомнить ActiveSheet в переменной, запустить код и снова активировать лист.

Dim OriginalActiveSheet As Worksheet
Set OriginalActiveSheet = ActiveSheet

For Each ws In ActiveWorkbook.Worksheets
    If ws.ProtectContents = False Then
        ws.Protect Password:=GetPassword()
    End If
Next ws

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