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
削除する 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
これで、呼び出しコードでtrue/falseをテストできます
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
を使用でき、これで機能するはずです。