在“针对每个工作表”循环之后丢失ActiveWorksheet

时间:2019-03-25 14:39:35

标签: excel vba office-2016

常规用于每个工作表循环以取消保护工作簿中的所有工作表,至少更改活动的工作表以保留实际的工作表。 此行为仅由Office2016识别,并且例程由命令按钮启动。如果从Makro,“事件”或“立即”窗口开始,则可以正常工作,并且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 :(得分:0)

实际上,代码根本不应更改活动的工作表。但是您可以做的是将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