web-dev-qa-db-ja.com

ユーザーフォームを呼び出して値を返す

Auto_Openというvbaコードがあります。いくつかのチェックを行い、ユーザー名とパスワードを要求するユーザーフォームを表示します。このユーザーフォームをuserform_name.showで呼び出しました。

私の問題は、ユーザーフォームコードからBooleanAuto_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
6
user2385809

削除する 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
4
Siddharth Rout

サブの代わりに関数を使用するのはどうですか?

Function loginbutton()
  ' your code

  loginbutton = bool
End Function

これで、呼び出しコードでtrue/falseをテストできます

if loginbutton() then
  'true responce
else
  'false responce
end if
2
Portland Runner

パブリック変数を使用せずにこれを行うことができます。

表示/非表示とロード/アンロードには違いがあるようです。

まだロードされているときにフォームを非表示にすると、フォームはクリアされないため、フォームのコントロールの状態を参照できます。

たとえば、フォームで日付ピッカー(DTPicker1と呼ばれる)を使用していた場合、モジュール内のコードは次のようになります。

Dim NewDay As Date

Load FrmDayPicker
FrmDayPicker.Show

NewDay = FrmDayPicker.DTPicker1.Value

Unload FrmDayPicker

Debug.Print NewDay

フォームでは、Me.Hideの代わりにUnload Meを使用でき、これで機能するはずです。

1
Noodle_Soup