Excel VBA密码保护命令按钮

Excel VBA密码保护命令按钮,excel,vba,Excel,Vba,我正在处理一个非常大而且有点脆弱的电子表格,我想限制对更复杂的宏的访问——删除或添加数据的宏。我不太担心安全问题,我更担心那些不知道自己在做什么的人。我曾经使用过“inputbox”密码技巧,但要反复输入密码会有点烦人。有没有办法让宏“记住”我输入了一次密码,然后在我关闭工作表后重置,而不将其存储在某个单元格中 以下是我当前使用的代码: Sub ControlPanel() Dim PassProtect As Variant PassProtect = InputBox(Prompt:="

我正在处理一个非常大而且有点脆弱的电子表格,我想限制对更复杂的宏的访问——删除或添加数据的宏。我不太担心安全问题,我更担心那些不知道自己在做什么的人。我曾经使用过“inputbox”密码技巧,但要反复输入密码会有点烦人。有没有办法让宏“记住”我输入了一次密码,然后在我关闭工作表后重置,而不将其存储在某个单元格中

以下是我当前使用的代码:

Sub ControlPanel()

Dim PassProtect As Variant

PassProtect = InputBox(Prompt:="Please enter the password to unlock the updater." & vbCrLf & "(Case Sensitive)", Title:="Control Panel")

  If PassProtect = vbNullString Then Exit Sub

If PassProtect = "password" Then
    ControlPanelForm.Show vbModeless    
Else: MsgBox Prompt:="Incorrect password. Please try again.", Buttons:=vbOKOnly
End If

End Sub

谢谢

在CommandButton1\u Click子过程中使用静态字符串变量。一旦输入正确,它将在会话期间被“记住”

Option Explicit

Private Sub CommandButton1_Click()
    Static pwd As String

try_again:
    If pwd <> "thePassword" Then
        'password challenge
        pwd = InputBox(Prompt:="Please enter the password to unlock the updater." & vbLf & "(Case Sensitive)", _
                       Title:="Control Panel")

        'check if the password challenge was cancelled
        If pwd = vbNullString Then Exit Sub

        'compare again
        GoTo try_again
    End If

    'all the good code once the password challenge has been passed
    Debug.Print "pass"

End Sub
选项显式
私有子命令按钮1_单击()
静态pwdas字符串
请重试:
如果pwd“密码”那么
'密码挑战
pwd=InputBox(提示:=“请输入密码以解锁更新程序。”&vbLf&“(区分大小写)”_
标题:=“控制面板”)
'检查密码质询是否已取消
如果pwd=vbNullString,则退出Sub
“再比较一下
去再试一次
如果结束
'密码质询通过后,所有良好的代码都将恢复
调试。打印“通过”
端接头

打开工作簿时,可以使用公共变量存储值,因此代码将变为:

Public pblnEnteredPassword As Boolean

Sub ControlPanel()

    Dim PassProtect As Variant

    If pblnEnteredPassword Then GoTo DoStuff

    PassProtect = InputBox(Prompt:="Please enter the password to unlock the updater." & vbCrLf & "(Case Sensitive)", Title:="Control Panel")

      If PassProtect = vbNullString Then Exit Sub

    If PassProtect = "password" Then
        pblnEnteredPassword = True
        GoTo DoStuff
    Else
        MsgBox Prompt:="Incorrect password. Please try again.", Buttons:=vbOKOnly
        Exit Sub
    End If

DoStuff:
    ControlPanelForm.Show vbModeless

End Sub

为什么不检查当前用户名是什么?您是否处于Active Directory域环境中?对不起,我以前没有听说过静态变量。我对它进行了测试,子系统中的静态变量或子系统外部的公共变量都可以工作。静态可能是一种更好的方法,因为它是一个更有限的变量范围。而且由于它被限制在声明它的子过程中,所以它不能像全局公共变量那样对其他子过程公开使用(除非这样做是可取的)。因此,Alt+F11,然后Ctrl+G,然后
pblnEnteredPassword=True
,poof被绕过。一个
Static
local会更好,但是即使这样也需要一个硬编码的密码,它完全不安全,也可能不存在。顺便说一句,
pbln
前缀被称为Systems Hungarian,这完全违背了Apps Hungarian的预期目的。考虑删除这些笨拙无用的前缀。当密码输入时,可以使用本地目录中的TXT文件(在其中添加密码以获得额外的安全性),并且在不再需要密码访问时删除。这不是一个完整的安全措施,而是一个“可读令牌”,以便它知道已输入密码。