【问题标题】:Verifying that a set password on a worksheet is correct though VBA通过 VBA 验证工作表上设置的密码是否正确
【发布时间】:2016-08-10 06:04:20
【问题描述】:

我对工作表进行了密码保护,并且我想在打开时验证密码没有被用户更改过。

我已尝试通过 VBA 在已更改密码的工作表上再次设置密码,以查看它是否会出错但未提供错误。

以下代码是我目前用来测试它的代码,它可以工作,但我认为您不必取消保护工作表然后保护它来验证密码。

Sub CheckSheetPassword()
    Dim ws As Worksheet

    On Error Resume Next
    For Each ws In Worksheets
        ws.Unprotect Password:="Password"
        ws.Protect Password:="Password"
        If Err <> 0 Then
            MsgBox "Failed To Verify Password on: " & ws.Name
            Err = 0
        End If
    Next ws

End Sub

我的代码解释:

上述代码循环遍历工作簿中的所有工作表,并通过使用原始密码取消对当前工作表的保护来检查工作表保护密码是否已更改。

然后它使用原始密码保护工作表,以防止其不受保护。 (如果当前密码与原始密码不同,则不会引发错误,并且此步骤不会发生任何事情。)

如果代码无法取消对工作表的保护,则会引发错误,并且会出现一个消息框,让我知道该工作表上的密码已更改。

在评估下一个工作表以确定哪些工作表仍具有正确密码之前,我将错误计数重置为零。

我要问的是,这可以在不必取消保护工作表的情况下完成吗?

【问题讨论】:

  • 您说您尝试查看它是否出错,但没有成功?如果您未保护工作表,您是如何尝试的,如果密码不同,它应该会出错。
  • 没有。没有任何属性/方法可以返回工作表密码,以便您可以将其与另一个字符串匹配。 Worksheet.Password,它会很酷,但违反密码的整个概念:)
  • 谢谢@cyboashu,这就是我一直在寻找的答案,我没有其他方法可以检查它。

标签: vba excel


【解决方案1】:

使用密码取消保护工作表后,您可以验证工作表是否受到保护。

完整代码如下:

Sub CheckSheetPassword()
    Dim ws As Worksheet

    On Error Resume Next
    For Each ws In Worksheets
        ws.Unprotect Password:="Password"
        If ws.ProtectContents = False Then
            ' The sheet is unprotected, so password hasn't changed
        Else
            ' The sheet is protected, so password has changed
            MsgBox "Failed To Verify Password on: " & ws.Name
        End If
    Next ws
End Sub

【讨论】:

  • OP 要求检查密码是否已更改,而不是是否受保护。
  • @DragonSamu 如果ws.Unprotect Password:="Password" 有效,则密码未更改。
  • 我明白这一点,因此我问 OP 为什么他说代码失败而它不应该失败
  • 我正在检查密码是否已更改,如果更改了密码,则在尝试使用原始密码取消对工作表的保护时,该代码将引发错误。该消息只是让我知道密码不是我设置的原始密码
  • @Trimax 您更新后的代码产生的结果与我的相同,只是方法不同,下一个问题是哪个代码更快?
【解决方案2】:

这个问题在 cmets 中得到了回答,说明我提出的方式是正确的。

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 2019-05-09
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多