我有一个Auto_Open的vba代码。它会进行一些检查,然后提示用户表单询问用户名和密码。我用userform_name.show
调用了这个用户表单。
我的问题是如何从用户表单代码中将Boolean
返回到我的Auto_Open
子。
我将验证凭据是否正确的代码链接到表单上的“登录”按钮。这是产生布尔值的代码。我需要将它返回到Auto_Open。
Private Sub loginbutton()
Dim bool As Boolean
Dim lrup
Dim r As Long
Dim pass As String
loginbox.Hide
'are fields empty
Do While True
If unBox.Text = "" Or pwBox.Text = "" Then
MsgBox ("You must enter a Username and Password")
Else
Exit Do
End If
loginbox.Show
Exit Sub
Loop
'find pw reated to username (if existant)
lrup = UserPass.Range("A1").Offset(UserPass.Rows.Count - 1, 0).End(xlUp).Row
If unBox = "b0541476" And pwBox = "theone" Then
bool = True
Else
MsgBox ("Invalid username or password. Please try again.")
loginbox.Show
Exit Sub
End If
For r = 2 To lrup
If unBox = Cells(r, 1) Then
pass = Cells(r, 2).Value
Exit For
End If
Next
If pass = "" Then
MsgBox ("Invalid username or password. Please try again.")
loginbox.Show
Exit Sub
Else
bool = True
End If
End Sub
答案 0 :(得分:3)
从userform代码区域中删除Dim bool As Boolean
并在模块中声明它,如下所示
这就是模块中的代码看起来像
Public bool As Boolean
Sub Auto_Open()
'
'~~> Rest of the code
'
UserForm1.Show
If bool = True Then
'~~> Do Something
Else
'~~> Do Something
End If
'
'~~> Rest of the code
'
End Sub
答案 1 :(得分:2)
如何使用函数而不是sub?
Function loginbutton()
' your code
loginbutton = bool
End Function
现在,在您的调用代码中,您可以测试true / false
if loginbutton() then
'true responce
else
'false responce
end if
答案 2 :(得分:1)
您可以设法在不使用公共变量的情况下执行此操作。
show / hide和load / unload之间似乎有区别。
如果您在表单仍然加载时隐藏它,它将不会被清除,因此您可以引用表单上控件的状态。
例如我在表单上使用日期选择器(称为DTPicker1
),模块中的代码如下所示:
Dim NewDay As Date
Load FrmDayPicker
FrmDayPicker.Show
NewDay = FrmDayPicker.DTPicker1.Value
Unload FrmDayPicker
Debug.Print NewDay
在您的表单上,您可以使用Me.Hide
加上Unload Me
,这应该可以使用
答案 3 :(得分:0)
更新:
我很快就忽略了公共变量。虽然这两种方法都可以工作,Pub Vars 和直接访问项目,但有时如果说它是一个列表,那么直接访问项目并不理想。
我现在有专门用于调用用户窗体的模块,这些模块只声明公共变量并调用用户窗体。然后我可以从用户窗体或模块调用这些模块,并在用户窗体关闭后访问公共变量。
例如:这是我现在使用的一个模块,非常基本,我所有的其他需求都可以调用这个模块/子。
Public ColSelectorDic As Object
Public Sub Col_Picker_Sub()
Col_Picker_UserForm.Show
End Sub
使用在调用用户窗体的模块中声明的公共变量是最简单的 IMO。但是,如果你想从单独的模块调用这个用户表单,你会得到关于重复声明/模糊名称的错误。
所以,如果你知道它只会被称为一个模块,Pub Vars 一直都是。就我而言,我使用的是“列选择器”用户表单,它非常简单,我希望能够在无法预见的未来项目中再次使用它,因此我尝试解决上述警告。
查看公共变量的这个答案,无需重复信息--> https://stackoverflow.com/a/18966341/5079799
这个答案与直接访问表单变量有关 --> https://stackoverflow.com/a/47919465/5079799 但我觉得它可以使用一些扩展。
此外,这是一篇很好的文章,它更深入地介绍了直接访问用户表单变量 --> https://gregmaxey.com/word_tip_pages/userform_pass_data.html
所以我的用户表单看起来像这样,名为 ColPicker
:
Private Sub UserForm_Initialize()
Dim i As Long
lCol = Get_lCol(ActiveSheet)
For i = 1 To lCol
ColumnLetter = Col_Letter(i)
Me.ComboBox1.AddItem ColumnLetter
Next
End Sub
Private Sub CommandButton1_Click()
Me.Hide
End Sub
Sub PassVarFromUserForm()
ColPicker.Show
Dim ColLetter As String
ColLetter = ColPicker.ComboBox1.Value
Unload ColPicker
Debug.Print ColLetter
End Sub
注意用户窗体中的“运行”/命令按钮是如何隐藏窗体的,然后我将值存储在一个变量中,然后通过利用它的名称从模块中卸载窗体。 (您只能在用户表单中使用 unload me
)。
该变量然后在模块内部可用,并且可以在开始时声明为 public 或在模块内部,这无关紧要,因为它可以在每个模块中以不同的方式声明,用户表单不知道/引用什么变量将存储信息的名称命名。