用于系统锁定Excel工作表的代码,仅用于1个电子表格(VB)

时间:2010-11-03 17:35:00

标签: excel vba

我基本上试图在excel中系统地锁定一张表(密码驱动)。我已经开发了以下代码,但是,它似乎只锁定了许多工作表中的1张(12月)。任何帮助都会非常感激。谢谢!

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Dim ws As Worksheet
 Dim strPassWord As String
 strPassWord = "apple"

 Sheets("Jan").Select
 Sheets("Feb").Select
 Sheets("Mar").Select
 Sheets("April").Select
 Sheets("May").Select
 Sheets("June").Select
 Sheets("July").Select
 Sheets("Aug").Select
 Sheets("Sept").Select
 Sheets("Oct").Select
 Sheets("Nov").Select
 Sheets("Dec").Select
 ActiveSheet.Protect Password:=strPassWord, DrawingObjects:=True, Contents:=True, Scenarios:=True
 ActiveSheet.EnableSelection = xlNoSelection

End Sub

Private Sub Workbook_Open()
 Dim ws As Worksheet
 Dim strPassWord As String
 strPassWord = InputBox(Prompt:="Password", _
  Title:="Enter Password", Default:="User Password")

 If strPassWord = "apple" Then

  Sheets("Jan").Select
  Sheets("Feb").Select
  Sheets("Mar").Select
  Sheets("April").Select
  Sheets("May").Select
  Sheets("June").Select
  Sheets("July").Select
  Sheets("Aug").Select
  Sheets("Sept").Select
  Sheets("Oct").Select
  Sheets("Nov").Select
  Sheets("Dec").Select
  ActiveSheet.Unprotect Password:=strPassWord
 Else
  MsgBox ("Password Incorrect")
 End If
End Sub

3 个答案:

答案 0 :(得分:0)

为什么在代码已经内置到Excel中时编写代码(请参阅“保护表”)?重新发明轮子通常不是一个好主意,对安全性来说是双倍的,因为当您在代码中对密码进行硬编码时很容易被发现。

然而,要回答你的核心问题。 ActiveSheet仅指顶部的工作表,而不是您调用的每个工作表。

答案 1 :(得分:0)

您需要选择工作表,然后用密码保护它。 select函数更改ActiveSheet。它不会添加到选择中。这最好通过将锁定代码移动到一个函数,然后在选择每个工作表后调用该函数来实现。

解锁表单需要进行类似的调整。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim ws As Worksheet
    Dim strPassWord As String
    strPassWord = "apple"

    Sheets("Jan").Select
    Call LockSheet
    Sheets("Feb").Select
    Call LockSheet
    Sheets("Mar").Select
    Call LockSheet
    Sheets("April").Select
    Call LockSheet
    Sheets("May").Select
    Call LockSheet
    Sheets("June").Select
    Call LockSheet
    Sheets("July").Select
    Call LockSheet
    Sheets("Aug").Select
    Call LockSheet
    Sheets("Sept").Select
    Call LockSheet
    Sheets("Oct").Select
    Call LockSheet
    Sheets("Nov").Select
    Call LockSheet
    Sheets("Dec").Select
    Call LockSheet

End Sub

Private Sub LockSheet

    ActiveSheet.Protect Password:=strPassWord, DrawingObjects:=True, Contents:=True, Scenarios:=True
    ActiveSheet.EnableSelection = xlNoSelection
End Sub

答案 2 :(得分:0)

据我所知,

ActiveSheet不能以这种方式使用。根据文件:

  

活动纸(顶部的纸张);如果没有工作表,则为null引用(在Visual Basic中为Nothing)。

它只会锁定您选择的最后一张纸。相反,你最好使用这样的代码:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim ws As Worksheet
    Dim strPassWord As String

    strPassWord = "apple"

    Call LockSheet(Sheets("Sheet1"))
    Call LockSheet(Sheets("Sheet2"))
    Call LockSheet(Sheets("Sheet3"))

End Sub

Private Sub Workbook_Open()
    Dim ws As Worksheet
    Dim strPassWord As String
    strPassWord = InputBox(Prompt:="Password", _
                            Title:="Enter Password", Default:="User Password")

    If strPassWord = "apple" Then
        Call UnlockSheet(Sheets("Sheet1"), strPassWord)
        Call UnlockSheet(Sheets("Sheet2"), strPassWord)
        Call UnlockSheet(Sheets("Sheet3"), strPassWord)
    Else
        MsgBox ("Password Incorrect")
    End If

End Sub

Private Sub LockSheet(sheet As Worksheet)
    sheet.Protect password:=strPassWord, DrawingObjects:=True, Contents:=True, Scenarios:=True
    sheet.EnableSelection = xlNoSelection
End Sub

Private Sub UnlockSheet(sheet As Worksheet, strPassWord As String)
    sheet.Unprotect password:=strPassWord
End Sub