保护工作表使Macro无法正常工作

时间:2019-05-16 08:18:46

标签: excel vba password-protection

我知道我已经阅读了很多问题,但是似乎没有人给我完成这项工作所需的代码。

我在Excel工作表的功能区中放置了许多按钮。作为示例,这些附加到将工作表复制到另一工作表的宏上

按下按钮即可运行宏:

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

现在。...我需要保护工作表1和2中的项目/单元格。保护工作表时,宏会使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

但是这似乎也不起作用-我想这可能与宏将工作表复制到也已锁定的另一工作表有关吗?

我还应该注意,工作簿中还有其他工作表受到保护,但是没有附加宏,因此它们仍处于受保护状态,这可能会引起问题吗?

一些帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

好的-所以我已经用它来解决这个问题,但是如果有人可以给出更雄辩的解决方案,那就太好了

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")

答案 1 :(得分:0)

UserInterFaceOnly

当您保存带有受UserInterFaceOnly保护的图纸的工作簿时,此属性在保存的文件上 已删除 。因此,在重新打开文件时,工作表将保持受保护状态,但也不能通过编程方式进行更改。

因此,对于这段代码,乍一看似乎完全可以满足您的需求:

Private Sub Workbook_Open()

Sheets(1).Protect Password:="secret", UserInterFaceOnly:=True
Sheets(2).Protect Password:="secret", UserInterFaceOnly:=True

End Sub

..如果您保存并重新打开文件,则在您运行上述Workbook_Open()时,它将无法设置保护,因为已经存在适当的保护。

解决方法是为每张工作表添加行,这些行会首先删除任何适当的保护。然后,您可以再次正确设置它-像这样:

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
相关问题