2017-09-04 12 views
0

if文を使用して、テキストフィールドにデータベースの値が含まれているかどうかを確認しようとしています。何も入力されていないときはエラーを表示します。ここでif文でのDLookupの不正使用VBA MSAccess

はコードです:ここでは

Private Sub btnLogEntry_Click() 


If Me.txtMemberID.Value <> "" And DLookup("MemberID", "Member", "MemberID = " & Me.txtMemberID.Value & "") > 0 Then 
MsgBox "Entry Successful", vbInformation, "Alert" 
MsgBox "Welcome", vbInformation, "Alert" 
TempVars!activtyMemberID = Me.txtMemberID.Value 
TempVars!activityTime = Me.txtTime.Value 
TempVars!activityAccessType = Me.txtAccessType.Value 
TempVars!activityFranchiseID = DLookup("[FranchiseID]", "Member", "MemberID = " & Me.txtMemberID.Value) 
DoCmd.RunSQL "INSERT INTO GymActivity VALUES (Tempvars!activtyMemberID, 
Tempvars!activityTime, Tempvars!activityAccessType, 
Tempvars!activityFranchiseID)" 

DoCmd.Close 
DoCmd.OpenForm "frmMainPage" 
Else 
MsgBox "Please re-enter your Member ID" 

End If 
End Sub 

は、私は受信エラーです: https://imagebin.ca/v/3ZBvRiXlZM2t

+0

「activtyMemberID」のスペルミス!あなたは本当にあなたのモジュールの上で 'option explicit'を使用し、そのような種類のエラーを避けるために変数を宣言する必要があります –

答えて

0

問題はご縁のケースです。私。ときtxtMemberID.Text == ""

VBAはレイジー評価のサポートが非常に限られていることに注意してください。評価されたものがこれまでのところチェックに合格した場合にのみネストされた条件の評価が行われ、And演算子はこのサポートに属しませんAndステートメントで連結された行は、行の最初の(左端の)ものがFalseになった場合でも、出現順に評価されます。

したがって、txtMemberIDテキストボックスにテキストがない場合、DCount(...関数は評価されていますが、条件には不正な表現で終わるでしょう。エラーメッセージに示されているとおりです。

この状況を克服するための2つのオプションがあります。遅延評価はwithin the Select Case statementのみサポートされています。

他の選択肢はそうのように、巣にあなたのIf文です:

Private Sub btnLogEntry_Click() 

If Me.txtMemberID.Value <> "" Then 
    If DLookup("MemberID", "Member", "MemberID = " & Me.txtMemberID.Value & "") > 0 
     MsgBox "Entry Successful", vbInformation, "Alert" 
     MsgBox "Welcome", vbInformation, "Alert" 
     TempVars!activtyMemberID = Me.txtMemberID.Value 
     TempVars!activityTime = Me.txtTime.Value 
     TempVars!activityAccessType = Me.txtAccessType.Value 
     TempVars!activityFranchiseID = DLookup("[FranchiseID]", "Member", "MemberID = " & Me.txtMemberID.Value) 
     DoCmd.RunSQL "INSERT INTO GymActivity VALUES (Tempvars!activtyMemberID, 
     Tempvars!activityTime, Tempvars!activityAccessType, 
     Tempvars!activityFranchiseID)" 

     DoCmd.Close 
     DoCmd.OpenForm "frmMainPage" 
    Else 
     MsgBox "The specified MemberID not found." 
    End If 
Else 
    MsgBox "Please re-enter your Member ID"  
End If 

End Sub 
0

あなたがのDLookupが「見つからない」ためヌルを返すという事実を利用する必要がありますし、一度にFranchiseIDを検索:

Private Sub btnLogEntry_Click() 

    Dim FranchiseID As Variant 

    If Not IsNumeric(Me.txtMemberID.Value) Then 
     ' None or invalid user input. Exit. 
     MsgBox "A member ID is required." 
     Exit Sub 
    End If 

    FranchiseID = DLookup("[FranchiseID]", "Member", "MemberID = " & Me.txtMemberID.Value & "") 

    If Not IsNull(FranchiseID) Then 
     MsgBox "Entry Successful", vbInformation, "Alert" 
     MsgBox "Welcome", vbInformation, "Alert" 

     TempVars!activtyMemberID = Me.txtMemberID.Value 
     TempVars!activityTime = Me.txtTime.Value 
     TempVars!activityAccessType = Me.txtAccessType.Value 
     TempVars!activityFranchiseID = FranchiseID 

     DoCmd.RunSQL "INSERT INTO GymActivity VALUES (Tempvars!activtyMemberID, Tempvars!activityTime, Tempvars!activityAccessType, Tempvars!activityFranchiseID)" 

     DoCmd.Close 
     DoCmd.OpenForm "frmMainPage" 
    Else 
     MsgBox "Please re-enter your Member ID"    
    End If 

End Sub 
+0

もしtxtMemberIDが長さがゼロの文字列と等しいなら、それは失敗します。 'DLookUp'(' Where MemberID = '、MemberIDは数字なので、区切り文字を持たないので無効です)。 @ Bozhidar-Stoinevによるアプローチは、このエラーを回避します。 –

+0

バインドされていないテキストボックスは、空の文字列を保持しません。しかし、欠けているものは脱出する方法です。それが追加されました。 – Gustav

+0

ああ、はい、私の文言は間違っていますが、その点は正しくありません。 'Me.txtMemberID.Value'が' Null'の場合、結果は同じになります(文字列を 'Null 'と連結すると、文字列を長さゼロの文字列に連結するのと同じ結果になります)。私はあなたがエラーを修正したのを見る。 –