如何在 Excel VBA 中使用户表单在按下 'red x' 时记住密码

How to make userform in Excel VBA remember password when 'red x' is pressed

我有一个用 username/password 提示调用函数的用户表单。

用户通常需要 运行 多次,每次都会提示输入登录凭据,所以我希望用户表单在输入后记住 user/password,直到工作簿完成关闭。

在用户按下 'process' 按钮或从 'close' 按钮关闭用户窗体之前它工作正常,但是当 he/she 使用 'red x' 关闭它时, user/pass 在下一个 运行 消失。

我知道 'red x' 可以被禁用,但我很好奇是否有另一种方法可以让用户窗体即使在按下 'red x' 时也能记住?

到目前为止,这是我的代码:

Private Sub cbCancel_Click()
maplogin.Hide
End Sub

Sub cbProcess_Click()

Dim drivetomap As String
Static user As String
Static pass As String

pcname = ActiveCell.Value
user = Me.txtUser.Value
pass = Me.txtPass.Value
...

您可以将 X 重定向到 运行 取消按钮代码:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Cancel = True
        cbCancel_Click
    End If
End Sub

这里有几个点。让我们先处理您的具体问题:您可以使用 QueryClose 事件来处理 Userform 被关闭,在您的情况下,您将 Cancel 参数设置为 True (或基本上任何非 0 的整数)这样您就可以 Hide 表格而不是 Unload 表格。像这样:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> vbFormCode Then
        Cancel = True
        Me.Hide
    End If
End Sub

但还有其他问题。

  1. 如果您使用这个 Userform 实例来存储密码,那么您需要在模块级别限定变量的范围,以便您可以访问 [=21= 之外的变量] 常规。如下:

    Option Explicit
    Private mPcName As String
    Private mUser As String
    Private mPass As String
    
    Private Sub cbCancel_Click()
        maplogin.Hide
    End Sub
    
    Sub cbProcess_Click()
    
        mPcName = ActiveCell.Value
        mUser = Me.txtUser.Value
        mPass = Me.txtPass.Value
        '...
    End Sub
    
  2. VBA 中的 Static 关键字只能在过程级别使用。是的,它会在过程结束时保留变量的值,但您仍然无法在过程之外访问这些变量。因此使用 Private 进行模块级声明。

  3. 如果您将与应用程序相关的变量存储在 Userform 中,生活就会很棘手。这基本上意味着你永远不能 Unload 在程序期间 Userform。更好的方法是将这些值传递给其他一些存储方法。示例可能是将它们传递到 Module,将它们传递到 Class,将它们写入隐藏的 Worksheet,等等。模块的示例如下:

模块

    Option Explicit
    Private mUser As String
    Private mPass As String

    Public Sub SetLogin(user As String, pass As String)
        mUser = user
        mPass = pass
    End Sub

用户表单

    SetLogin Me.txtUser.Value, Me.txtPass.Value