调用userform并返回值

时间:2013-09-23 18:21:00

标签: excel excel-vba excel-2010 userform vba

我有一个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

4 个答案:

答案 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 或在模块内部,这无关紧要,因为它可以在每个模块中以不同的方式声明,用户表单不知道/引用什么变量将存储信息的名称命名。