Excel 调用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

我有一个自动打开的vba代码。它执行一些检查,然后提示一个userform,要求输入用户名和密码。我用
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解决方案同样有效,但存在更大的安全风险。