输入值后锁定单元格,使用正确密码(VBA)解锁的可能性

时间:2014-12-15 14:40:59

标签: excel security excel-vba vba

我们有一张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

我在这里抓住了双击事件,这是一个事件之前,更适合我的需要。这会更改值,但您必须通过输入框输入值,这限制了单元格链接功能。它还不断生成消息“取消保护工作表以进行编辑......”。

  • 我的原始问题是否有其他方法/解决方案?
  • 是否有更适合我需求的事件(类似于before_change)?
  • 如果无法回答上述问题,是否可以删除取消保护表单的消息?

有关详细解决方案,请参阅答案。

1 个答案:

答案 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