常规用于每个工作表循环以取消保护工作簿中的所有工作表,至少更改活动的工作表以保留实际的工作表。 此行为仅由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
答案 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