Excel 保护选项 - 当不同区域需要由不同的员工更新时

Excel 保护选项 - 当不同区域需要由不同的员工更新时

在 Excel 7 中使用密码保护时 - 您有哪些选项不需要您在保存/关闭文件之前再次重新输入密码 - 例如,如果您在关闭时忘记重新输入密码,仍然可以保护它。

我通常使用另存为 - 常规选项过程 - 因为您不需要在关闭/保存之前重新输入密码,但是我需要包含其他人可以更改的单元格范围(无需访问所有内容)以及让整个电子表格保持为其他员工只读。

所以我需要 3 个访问级别 - 2 个带密码,第 3 个为只读。

答案1

在一个 Excel 工作簿中完成此操作是不可能的。您应该尝试将不同的工作簿提供给不同的员工,然后让他们互相指向以填写缺失的数据。

答案2

如果您不想使用宏,那么您能做的事情不多。常规选项流程是您在保存前无需重新输入密码的唯一方法。如果您为每个可以输入的用户设置了单独的工作表选项卡,那么您可以通过在工作表级别进行保护来获得单独的密码,但您需要记住重新保护工作表。

有了宏,更多的事情就成为可能。下面是我设置宏的方法。

  1. 将您的工作簿保存为宏文件 (.xlsm)。
  2. 创建三个命名区域,一个包含用户 1 可以更改的所有单元格,一个包含用户 2 可以更改的所有单元格,一个包含所有可以更改的单元格(用户 1 和用户 2)。确保命名区域设置在工作簿级别,而不是工作表级别。
  3. 切换到 Visual Basic 编辑器。
  4. 将以下代码添加到您的工作簿。第一部分放入ThisWorkbook,第二和第三部分放入常规代码模块。(要添加模块,请单击Insert-> Module。)
  5. 修改代码模块中的常量以匹配您想要的密码和命名范围。
  6. 由于密码在宏中是纯文本,因此您需要锁定 VBA 项目,以便没有人可以查看它。单击Tools->VBAProject Properties...然后选择Protection选项卡。检查Lock project for viewing并输入密码。(我通常不费心这样做。我的大多数用户都不够精通技术,无法找到密码,而且我只是试图防止意外或无意识的损坏。)
  7. 保存修改的工作簿。

本工作簿:

Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
   LockUser GetUserInputRange(AllInputCells:=True)
End Sub

Private Sub Workbook_Open()
   UnlockInputCells
End Sub

代码模块1:

Option Explicit

Public Const PWD_REAL As String = "test"    ' this is the password the worksheet is actually locked with
Public Const PWD_INPUT1 As String = "test1" ' password to unlock NAMED_RANGE1
Public Const PWD_INPUT2 As String = "test2" ' password to unlock NAMED_RANGE2

Public Const NAMED_RANGE1 As String = "Name1"  ' Named Range for user 1
Public Const NAMED_RANGE2 As String = "Name2"  ' Named Range for user 2
Public Const NAMED_ALL As String = "AllCells"  ' Named Range that includes all input cells

代码模块2:

Option Explicit

Sub UnlockInputCells()
   UnlockUser GetUserInputRange
End Sub
Sub LockInputCells()
   LockUser GetUserInputRange
End Sub

'-----------------------------------------------
Function GetUserInputRange(Optional AllInputCells As Boolean = False) As Range
   Dim rng As Range, strInputMsg As String

   Set rng = Nothing
   strInputMsg = "Enter your password to edit." & vbCrLf & vbCrLf _
               & "Press cancel if you just want to look at the report."

   If AllInputCells Then
      Set rng = ThisWorkbook.Names(NAMED_ALL).RefersToRange
   Else
      Select Case InputBox(strInputMsg)
      Case PWD_INPUT1
         Set rng = ThisWorkbook.Names(NAMED_RANGE1).RefersToRange
      Case PWD_INPUT2
         Set rng = ThisWorkbook.Names(NAMED_RANGE2).RefersToRange
      Case PWD_REAL
         Set rng = ThisWorkbook.Names(NAMED_ALL).RefersToRange
      End Select
   End If

   Set GetUserInputRange = rng

End Function

Private Sub UnlockUser(rngInput As Range)
   Dim sht As Worksheet

   If Not rngInput Is Nothing Then

      ' unprotect the worksheet
      Set sht = rngInput.Parent
      sht.Unprotect PWD_REAL

      ' unlock given user input cells
      With rngInput
         .Locked = False
         .Interior.Color = XlRgbColor.rgbAliceBlue
         .Range("A1").Select
      End With

      ' reprotect the worksheet
      sht.Protect PWD_REAL
      MsgBox "Your input cells have been unlocked."

   End If

End Sub

Sub LockUser(rngInput As Range)
   Dim sht As Worksheet

   If Not rngInput Is Nothing Then
      ' If the range includes locked and unlocked cells, .Locked returns Null
      If Not rngInput.Locked Or IsNull(rngInput.Locked) Then

         ' unprotect worksheet
         Set sht = rngInput.Parent
         sht.Unprotect PWD_REAL

         ' lock given user fields
         With rngInput
            .Locked = True
            .Interior.ColorIndex = xlColorIndexNone
         End With

         ' reprotect worksheet
         sht.Protect PWD_REAL

      End If
   End If

End Sub

此代码的工作原理如下:打开工作簿时,它会要求输入密码。如果给定的密码与已知密码之一匹配,它将解锁与该密码相关的命名范围。如果用户在打开时未解锁,他们可以随时通过运行 UnlockInputCells 宏来解锁。在工作簿保存之前,它会自动锁定所有用户输入单元格。

相关内容