簡體   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