保护工作表会阻止宏工作

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