Excel 调用userform并返回值
我有一个自动打开的vba代码。它执行一些检查,然后提示一个userform,要求输入用户名和密码。我用Excel 调用userform并返回值,excel,excel-2010,userform,vba,Excel,Excel 2010,Userform,Vba,我有一个自动打开的vba代码。它执行一些检查,然后提示一个userform,要求输入用户名和密码。我用userform\u name.show调用了这个userform 我的问题是如何将布尔值从用户表单代码返回到我的Auto_Opensub 我将验证凭据是否正确的代码链接到表单上的“登录”按钮。这是生成布尔值的代码。我需要把它放回自动开启状态 Private Sub loginbutton() Dim bool As Boolean Dim lrup Dim r As L
userform\u name.show
调用了这个userform
我的问题是如何将布尔值
从用户表单代码返回到我的Auto_Open
sub
我将验证凭据是否正确的代码链接到表单上的“登录”按钮。这是生成布尔值的代码。我需要把它放回自动开启状态
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
从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
用函数代替子函数怎么样
Function loginbutton()
' your code
loginbutton = bool
End Function
现在,您可以在调用代码中测试真/假
if loginbutton() then
'true responce
else
'false responce
end if
您可以在不使用公共变量的情况下做到这一点 显示/隐藏和加载/卸载之间似乎存在差异 如果在窗体仍处于加载状态时隐藏该窗体,则不会清除该窗体,因此可以引用窗体上控件的状态 例如,我在表单上使用了一个日期选择器(称为
DTPicker1
),模块中的代码如下所示:
Dim NewDay As Date
Load FrmDayPicker
FrmDayPicker.Show
NewDay = FrmDayPicker.DTPicker1.Value
Unload FrmDayPicker
Debug.Print NewDay
在您的表单上,您可以使用Me.Hide
而不是Unload Me
,这应该可以工作更新:
我很快就排除了公共变量。虽然这两种方法都可以工作,Pub Vars和直接访问项目,但有时直接访问项目(如果是列表)并不理想
我现在有专门用于调用UserForms的模块,这些模块只调用公共变量并调用userform。然后,我可以从UserForms或modules调用这些模块,并在userform关闭后访问公共变量
这是我现在使用的一个模块,非常基本,我所有的其他需求都可以称为这个模块/子模块
Public ColSelectorDic As Object
Public Sub Col_Picker_Sub()
Col_Picker_UserForm.Show
End Sub
在IMO中,使用调用UserForm的模块中声明的公共变量是最简单的。但是,这有一个警告,如果您想从单独的模块调用这个用户表单,您将得到关于重复声明/不明确名称的错误 所以,如果你知道它只会被称为一个模块,Pub变量会一直存在。在我的例子中,我使用了一个“Column Picker”用户表单,它非常简单,我希望能够在不可预见的未来项目中再次使用它,因此我尝试解决上述警告 有关公共变量,请参见此答案,无需重复信息--> 这个答案与直接访问表单变量有关--> 但我觉得它需要一些扩展 另外,这是一篇很好的文章,它更深入地介绍了如何直接访问userform变量--> 因此,我的用户表单如下所示,名为
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
注意UserForm中的“Run”/Command按钮是如何隐藏表单的,然后我将值存储在变量中,然后利用表单的名称从模块中卸载表单。(您只能在用户表单中使用卸载我
)
然后变量在模块内可用,可以在开始时声明为public,也可以在模块内声明,这并不重要,因为它在每个模块中的声明不同,userform不知道/引用信息将存储在哪个变量名中。“这是生成boolian的代码”-它在哪里?对不起,我加了它。代码结束后,如何将“bool”传递回Auto_-Open?很容易被人更改以覆盖。这是一个完全不同的问题:)这基本上回答了如何声明布尔变量并在userform中使用它,然后将其传递给
Auto_-Open
是的,您是正确的。您的方法只适用于所问的问题。虽然有效,但如果我需要从单独的模块中定义/调用该变量,该怎么办?@FreeSoftwareServers感谢您的否决票,并留下评论。我的回答是针对老年退休金计划的需要。当我写下这个答案时,我不知道8年后有人会有不同的查询……不,登录按钮在用户表单上。userform必须先运行,然后在按下表单上的“LogIn”按钮后再运行loginbutton()。如果我理解正确,只要在正确的位置调用函数,它的工作方式就会相同。无论登录代码是运行还是结束,我只是检查当它运行完后,根据内部运行的内容返回true或false@Siddharth解决方案同样有效,但存在更大的安全风险。