Если вы не хотите использовать макросы, вы не можете ничего сделать. Процесс «Общие параметры» - единственный способ повторного ввода пароля перед сохранением. Если у вас есть отдельная вкладка рабочего листа для каждого пользователя, который может вводить данные, у вас может быть отдельный пароль, обеспечивающий защиту на уровне листа, но вам необходимо помнить, чтобы повторно защитить рабочий лист.
С макросами становится возможным больше вещей. Вот как я бы это настроил.
- Сохраните вашу книгу как файл макроса (.xlsm).
- Создайте три Именованных Диапазона, один, который включает все ячейки, которые может изменить пользователь 1, один со всеми ячейками, которые может изменить пользователь 2, и один со всеми ячейками (пользователь 1 и пользователь 2), которые могут быть изменены. Убедитесь, что именованные диапазоны установлены на уровне рабочей книги, а не на уровне рабочей таблицы.
- Переключитесь на редактор Visual Basic.
- Добавьте приведенный ниже код в вашу книгу. Первая часть находится в
ThisWorkbook
, вторая и третья части - в обычных модулях кода. (Чтобы добавить модуль, нажмите Insert
-> Module
.)
- Измените константы в модуле кода, чтобы они соответствовали желаемым паролям и именованным диапазонам.
- Поскольку в макросе пароли представляют собой обычный текст, вам необходимо заблокировать проект VBA, чтобы никто не мог его просмотреть. Нажмите
Tools
-> VBAProject Properties...
затем выберите вкладку Protection
. Проверьте Lock project for viewing
и введите пароль. (Обычно я не пытаюсь это сделать. Большинство моих пользователей недостаточно разбираются в технологиях, чтобы найти пароли, и я все равно пытаюсь защитить их от случайного или бездумного повреждения.)
- Сохраните измененную книгу.
ThisWorkbook:
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. Перед сохранением книги автоматически блокируются все ячейки ввода пользователя.