【问题标题】:How to make userform in Excel VBA remember password when 'red x' is pressed按下“红色x”时如何使Excel VBA中的用户窗体记住密码
【发布时间】:2015-11-24 16:27:57
【问题描述】:

我有一个使用用户名/密码提示调用函数的用户表单。

用户通常必须多次运行它,并且每次都会提示输入登录凭据,因此我希望用户表单在给出用户/密码后记住用户/密码,直到工作簿关闭。

在用户按下“进程”按钮或从“关闭”按钮关闭用户窗体之前工作正常,但是当他/她用“红色 x”关闭它时,用户/通行证在下一次运行时消失.

我知道'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
...

【问题讨论】:

  • 您可以使用隐藏的工作表来保存用户输入。

标签: vba excel user-input userform remember-me


【解决方案1】:

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

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

【讨论】:

  • 经过测试。效果很好!简单的。我喜欢!
【解决方案2】:

这里有几个点。让我们首先处理您的具体问题:您可以使用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 实例来存储密码,那么您需要在模块级别限定变量范围,以便您可以在 cbProcess_Click 例程之外访问变量。如下:

    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

【讨论】:

  • 很好的解释,现在我明白它的逻辑了。此方法与其他答案一样有效。我不想在这个用户表单之外使用用户/通行证。不会有其他用户表单或模块使用这些数据。它调用一个函数,该函数将使用数据映射仅适用于 Windows 域管理员帐户的网络驱动器。你的第三点有一些逻辑。但是当我将用户更改为非管理员时,它立即拒绝工作。
猜你喜欢
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多