Вызов userform и возврат значения

у меня есть код vba, который Auto_Open. Он выполняет некоторые проверки, затем запрашивает форму пользователя, которая запрашивает имя пользователя и пароль. Я назвал эту userform с userform_name.show.

моя проблема в том, как я могу вернуть Boolean мой Auto_Open sub из кода userform.

я связал код, который проверяет правильность учетных данных, с кнопкой "вход" в форме. это код, который создает логическое значение. Мне нужно вернуть его в 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

3 ответов


удалить Dim bool As Boolean из области кода userform и объявите его в модуле, как показано ниже

вот как будет выглядеть ваш код в модуле

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

Как насчет использования функции вместо sub?

Function loginbutton()
  ' your code

  loginbutton = bool
End Function

теперь в вашем вызывающем коде вы можете проверить true/false

if loginbutton() then
  'true responce
else
  'false responce
end if

вы можете сделать это без использования общедоступных переменных.

кажется, есть разница между show/hide и load / unload.

если вы скрываете форму, пока она все еще загружена, она не будет очищена, поэтому вы можете ссылаться на состояние элементов управления в форме.

например, я использовал выбор даты (называемый DTPicker1) на форме, мой код в модуль выглядит примерно так:

Dim NewDay As Date

Load FrmDayPicker
FrmDayPicker.Show

NewDay = FrmDayPicker.DTPicker1.Value

Unload FrmDayPicker

Debug.Print NewDay

на вашей форме, вы можете просто использовать Me.Hide insteaded из Unload Me и это должно работать