如何在 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
但还有其他问题。
如果您使用这个 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
VBA 中的 Static
关键字只能在过程级别使用。是的,它会在过程结束时保留变量的值,但您仍然无法在过程之外访问这些变量。因此使用 Private
进行模块级声明。
如果您将与应用程序相关的变量存储在 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
我有一个用 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
但还有其他问题。
如果您使用这个
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
VBA 中的
Static
关键字只能在过程级别使用。是的,它会在过程结束时保留变量的值,但您仍然无法在过程之外访问这些变量。因此使用Private
进行模块级声明。如果您将与应用程序相关的变量存储在
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