保护工作表会阻止宏工作
Protecting Sheets stops Macro from working
我知道有很多关于此的问题,我已经阅读过 - 但 none 似乎给了我完成这项工作所需的代码。
我在 excel sheet 的功能区中放置了一些按钮。这些附加到将 sheet 复制到另一个 sheet 的宏,例如
宏是运行按下按钮:
Sub btnSheet1_onAction(control As IRibbonControl)
mFunction.CopySheet1toSheet2
End Sub
宏包含在我的 mFunction 模块中:
Public Sub CopySheet1toSheet2()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
ws.Cells.Copy Destination:=ThisWorkbook.Sheets(2).Cells
End Sub
现在....我需要在 sheet 1 和 2 中保护 items/cells。当我保护 sheets 时,宏会使 excel 崩溃 - 不运行时错误或任何东西。
我已将以下代码插入 'ThisWorkbook'
Private Sub Workbook_Open()
Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True
End Sub
但还是不行——我也试过在 mFunction 模块中使用下面的代码
Public Sub CopySheet1toSheet2()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
ws.Unprotect Password = "secret"
ws.Cells.Copy Destination:=ThisWorkbook.Sheets(2).Cells
ws.Protect Password = "secret"
End Sub
但这似乎也不起作用 - 我猜这可能与宏正在将 sheet 复制到另一个也被锁定的 sheet 这一事实有关?
我还应注意,工作簿中还有其他 sheet 受保护,但没有附加宏,因此它们保持受保护状态,这会导致问题吗?
不胜感激!!
好的 - 所以我已经将其用作解决方法,但如果有人能提供更多 eloquent 解决方案那就太好了:
Dim ws As Worksheet
Set ws1 = ThisWorkbook.Worksheets(1)
Set ws2 = ThisWorkbook.Worksheets(2)
ws1.Unprotect ("2402")
ws2.Unprotect ("2402")
ws1.Cells.Copy Destination:=ws2.Cells
ws1.Protect ("2402")
ws2.Protect ("2402")
UserInterFaceOnly
当您保存 sheet 的工作簿并使用 UserInterFaceOnly
进行保护时,此 属性 被 移除 在保存的文件上。因此,在重新打开文件时,sheets 将保持受保护状态,但也不能以编程方式更改。
因此,关于这段代码,乍一看似乎完全符合您的需要:
Private Sub Workbook_Open()
Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True
End Sub
.. 如果您保存并重新打开您的文件,当您的上述 Workbook_Open()
运行s 将无法设置保护,因为已经存在保护。
解决方法是为每个 sheet 添加行,这些行首先删除任何保护。然后你可以再次正确设置它 - 像这样:
Private Sub Workbook_Open()
Sheets(1).Unprotect Password:="secret"
Sheets(2).Unprotect Password:="secret"
Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True
End Sub
这应该可以让您的复制代码 运行 没有问题,因为我看不出那部分有什么问题。
顺便说一下,如果您的密码相同,您可以稍微整理一下:
Private Sub Workbook_Open()
Dim sh As Worksheet
For Each sh In Array(Sheets(1), Sheets(2))
sh.Unprotect Password:="secret"
sh.Protect Password:="secret", UserInterFaceOnly:=True
Next
End Sub
我知道有很多关于此的问题,我已经阅读过 - 但 none 似乎给了我完成这项工作所需的代码。
我在 excel sheet 的功能区中放置了一些按钮。这些附加到将 sheet 复制到另一个 sheet 的宏,例如
宏是运行按下按钮:
Sub btnSheet1_onAction(control As IRibbonControl)
mFunction.CopySheet1toSheet2
End Sub
宏包含在我的 mFunction 模块中:
Public Sub CopySheet1toSheet2()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
ws.Cells.Copy Destination:=ThisWorkbook.Sheets(2).Cells
End Sub
现在....我需要在 sheet 1 和 2 中保护 items/cells。当我保护 sheets 时,宏会使 excel 崩溃 - 不运行时错误或任何东西。
我已将以下代码插入 'ThisWorkbook'
Private Sub Workbook_Open()
Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True
End Sub
但还是不行——我也试过在 mFunction 模块中使用下面的代码
Public Sub CopySheet1toSheet2()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
ws.Unprotect Password = "secret"
ws.Cells.Copy Destination:=ThisWorkbook.Sheets(2).Cells
ws.Protect Password = "secret"
End Sub
但这似乎也不起作用 - 我猜这可能与宏正在将 sheet 复制到另一个也被锁定的 sheet 这一事实有关?
我还应注意,工作簿中还有其他 sheet 受保护,但没有附加宏,因此它们保持受保护状态,这会导致问题吗?
不胜感激!!
好的 - 所以我已经将其用作解决方法,但如果有人能提供更多 eloquent 解决方案那就太好了:
Dim ws As Worksheet
Set ws1 = ThisWorkbook.Worksheets(1)
Set ws2 = ThisWorkbook.Worksheets(2)
ws1.Unprotect ("2402")
ws2.Unprotect ("2402")
ws1.Cells.Copy Destination:=ws2.Cells
ws1.Protect ("2402")
ws2.Protect ("2402")
UserInterFaceOnly
当您保存 sheet 的工作簿并使用 UserInterFaceOnly
进行保护时,此 属性 被 移除 在保存的文件上。因此,在重新打开文件时,sheets 将保持受保护状态,但也不能以编程方式更改。
因此,关于这段代码,乍一看似乎完全符合您的需要:
Private Sub Workbook_Open()
Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True
End Sub
.. 如果您保存并重新打开您的文件,当您的上述 Workbook_Open()
运行s 将无法设置保护,因为已经存在保护。
解决方法是为每个 sheet 添加行,这些行首先删除任何保护。然后你可以再次正确设置它 - 像这样:
Private Sub Workbook_Open()
Sheets(1).Unprotect Password:="secret"
Sheets(2).Unprotect Password:="secret"
Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True
End Sub
这应该可以让您的复制代码 运行 没有问题,因为我看不出那部分有什么问题。
顺便说一下,如果您的密码相同,您可以稍微整理一下:
Private Sub Workbook_Open()
Dim sh As Worksheet
For Each sh In Array(Sheets(1), Sheets(2))
sh.Unprotect Password:="secret"
sh.Protect Password:="secret", UserInterFaceOnly:=True
Next
End Sub