在 Excel 7 中使用密码保护时 - 您有哪些选项不需要您在保存/关闭文件之前再次重新输入密码 - 例如,如果您在关闭时忘记重新输入密码,仍然可以保护它。
我通常使用另存为 - 常规选项过程 - 因为您不需要在关闭/保存之前重新输入密码,但是我需要包含其他人可以更改的单元格范围(无需访问所有内容)以及让整个电子表格保持为其他员工只读。
所以我需要 3 个访问级别 - 2 个带密码,第 3 个为只读。
答案1
在一个 Excel 工作簿中完成此操作是不可能的。您应该尝试将不同的工作簿提供给不同的员工,然后让他们互相指向以填写缺失的数据。
答案2
如果您不想使用宏,那么您能做的事情不多。常规选项流程是您在保存前无需重新输入密码的唯一方法。如果您为每个可以输入的用户设置了单独的工作表选项卡,那么您可以通过在工作表级别进行保护来获得单独的密码,但您需要记住重新保护工作表。
有了宏,更多的事情就成为可能。下面是我设置宏的方法。
- 将您的工作簿保存为宏文件 (.xlsm)。
- 创建三个命名区域,一个包含用户 1 可以更改的所有单元格,一个包含用户 2 可以更改的所有单元格,一个包含所有可以更改的单元格(用户 1 和用户 2)。确保命名区域设置在工作簿级别,而不是工作表级别。
- 切换到 Visual Basic 编辑器。
- 将以下代码添加到您的工作簿。第一部分放入
ThisWorkbook
,第二和第三部分放入常规代码模块。(要添加模块,请单击Insert
->Module
。) - 修改代码模块中的常量以匹配您想要的密码和命名范围。
- 由于密码在宏中是纯文本,因此您需要锁定 VBA 项目,以便没有人可以查看它。单击
Tools
->VBAProject Properties...
然后选择Protection
选项卡。检查Lock project for viewing
并输入密码。(我通常不费心这样做。我的大多数用户都不够精通技术,无法找到密码,而且我只是试图防止意外或无意识的损坏。) - 保存修改的工作簿。
本工作簿:
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 宏来解锁。在工作簿保存之前,它会自动锁定所有用户输入单元格。