繁体   English   中英

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

[英]Code to systematically lock excel sheets, only working on 1 spreadsheet (VB)

我基本上是试图在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

当Excel中已经内置了代码时,为什么还要编写代码来做到这一点(请参阅“保护表”)? 重新发明轮子通常不是一个好主意,为了安全起见,这是双重的,三倍,因此当您用容易发现的密码对密码进行硬编码时。

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

您将需要选择工作表,然后对其进行密码保护。 选择功能更改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

据我所知,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM