我们有一张excel表,用于输入数据。要保护数据,必须在输入值后锁定数据。在错误或稍后进行更正后,必须可以在输入密码后更改该值。
我一直在使用受保护的工作表,每次我尝试编辑单元格的值时,都会收到一条消息,告诉我取消保护工作表。因为我想要在VBA中处理密码,所以我想要触发一个事件。问题是,唯一可能的事件是worksheet_change事件。不幸的是,事件从未被触发,因为我收到消息说要取消保护工作表以便更改值。
我提出了一个临时解决方案,但不是100%用户友好:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Value <> "" Then
Dim pass As String
pass = InputBox("Enter Password")
If pass <> "password" Then
MsgBox ("Wrong password")
Else
Sheets("Blad1").Unprotect password:="password"
Target.Locked = False
Target.Value = InputBox("Enter your input")
Target.Locked = True
Sheets("Blad1").Protect password:="password"
End If
End If
End Sub
我在这里抓住了双击事件,这是一个事件之前,更适合我的需要。这会更改值,但您必须通过输入框输入值,这限制了单元格链接功能。它还不断生成消息“取消保护工作表以进行编辑......”。
有关详细解决方案,请参阅答案。
答案 0 :(得分:0)
最终,我通过添加Worksheet_BeforeDoubleClick事件解决了这个问题。当他们双击非空单元格时,系统会提示他们是否要解锁工作表。如果他们单击是,则必须输入密码,然后才能访问单元格输入。 要进行此设置,您必须阻止所有未经密码更改的单元格(具有公式&#39; s,标题等的单元格)并保留空单元格未被阻止。然后,使用密码保护工作表。别忘了在VBA上输入密码,或者知道如何访问密码的用户可能会在代码中看到密码。
这是我在最终版本中使用的代码:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Value <> "" Then
changeInput = MsgBox("Do you want to unlock the sheet?", vbYesNo + vbQuestion, "Unlock sheet")
If changeInput = vbYes Then
Dim pass As String
pass = InputBox("Enter Password")
If pass <> "password" Then
MsgBox ("Wrong password")
Else
ActiveSheet.Unprotect Password:="password"
Target.Locked = False
End If
End If
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cel As Range
ActiveSheet.Unprotect Password:="password"
For Each cel In Target
If cel.Value <> "" Then
cel.Locked = True
End If
Next cel
ActiveSheet.Protect Password:="password"
End Sub