Ms access MS Access 2010 VBA多个其他如果问题

Ms access MS Access 2010 VBA多个其他如果问题,ms-access,vba,if-statement,Ms Access,Vba,If Statement,我有一个MS Access表单,用户最多可以选择四个条件来过滤报告返回的记录。在VBA中,我尝试根据用户选择的筛选依据字段(如果有)动态构建筛选字符串。下面的代码给了我一个“Block If With End If”错误。我做错了什么 If (IsNull(frm!employee) = False) Then strFilter = "Trainee_First_Name + ' ' + Trainee_Last_Name = '" & frm!employee &

我有一个MS Access表单,用户最多可以选择四个条件来过滤报告返回的记录。在VBA中,我尝试根据用户选择的筛选依据字段(如果有)动态构建筛选字符串。下面的代码给了我一个“Block If With End If”错误。我做错了什么

If (IsNull(frm!employee) = False) Then
    strFilter = "Trainee_First_Name + ' ' +  Trainee_Last_Name = '" & frm!employee & "'"
    If IsNull(frm!sop) = False Then
        strFilter = strFilter + " AND sop_number = '" & frm!sop & "'"""
    End If
    If IsNull(frm!revision) = False Then
        strFilter = strFilter + " AND revision_number = '" & frm!revision & "'"
    End If
    If IsNull(frm!dept) = False Then
        strFilter = strFilter + " AND department = '" & frm!dept & "'"
    End If
Else
If (IsNull(frm!sop) = False) Then
    strFilter = "sop_number = '" & frm!sop & "'"
    If (IsNull(frm!employee) = False) Then
        strFilter = "Trainee_First_Name + ' ' +  Trainee_Last_Name = '" & frm!employee & "'"
    End If
    If IsNull(frm!revision) = False Then
        strFilter = strFilter + " AND revision_number = '" & frm!revision & "'"
    End If
    If IsNull(frm!dept) = False Then
        strFilter = strFilter + " AND department = '" & frm!dept & "'"
    End If
Else
If (IsNull(frm!revision) = False) Then
    strFilter = "revision_number = '" & frm!revision & "'"
    If (IsNull(frm!employee) = False) Then
        strFilter = " AND Trainee_First_Name + ' ' +  Trainee_Last_Name = '" & frm!employee & "'"
    End If
    If IsNull(frm!sop) = False Then
        strFilter = strFilter + " AND sop_number = '" & frm!sop & "'"""
    End If
    If IsNull(frm!dept) = False Then
        strFilter = strFilter + " AND department = '" & frm!dept & "'"
    End If
Else
If IsNull(frm!dept) = False Then
    strFilter = "department = '" & frm!dept & "'"
    If (IsNull(frm!employee) = False) Then
        strFilter = " AND Trainee_First_Name + ' ' +  Trainee_Last_Name = '" & frm!employee & "'"
    End If
    If IsNull(frm!sop) = False Then
        strFilter = strFilter + " AND sop_number = '" & frm!sop & "'"""
    End If
    If IsNull(frm!revision) = False Then
        strFilter = strFilter + " AND revision_number = '" & frm!revision & "'"
    End If
End If

如果您能给我任何改进此代码的建议,我将不胜感激。

问题是您的
其他。。。if
子句未以
结束if
终止。您需要使用
ElseIf

Else
  If ...
  End If
Else...
我在下面修改了您的代码以使用后一种语法。请注意下面的结束If

注意:您不需要**,这只是为了在代码块中引起注意

If (IsNull(frm!employee) = False) Then
        strFilter = "Trainee_First_Name + ' ' +  Trainee_Last_Name = '" & frm!employee & "'"
        If IsNull(frm!sop) = False Then
            strFilter = strFilter + " AND sop_number = '" & frm!sop & "'"""
        End If
        If IsNull(frm!revision) = False Then
            strFilter = strFilter + " AND revision_number = '" & frm!revision & "'"
        End If
        If IsNull(frm!dept) = False Then
            strFilter = strFilter + " AND department = '" & frm!dept & "'"
        End If
    Else
    If (IsNull(frm!sop) = False) Then
        strFilter = "sop_number = '" & frm!sop & "'"
        If (IsNull(frm!employee) = False) Then
            strFilter = "Trainee_First_Name + ' ' +  Trainee_Last_Name = '" & frm!employee & "'"
        End If
        If IsNull(frm!revision) = False Then
            strFilter = strFilter + " AND revision_number = '" & frm!revision & "'"
        End If
        If IsNull(frm!dept) = False Then
            strFilter = strFilter + " AND department = '" & frm!dept & "'"
        End If


**End If**
    Else
    If (IsNull(frm!revision) = False) Then
        strFilter = "revision_number = '" & frm!revision & "'"
        If (IsNull(frm!employee) = False) Then
            strFilter = " AND Trainee_First_Name + ' ' +  Trainee_Last_Name = '" & frm!employee & "'"
        End If
        If IsNull(frm!sop) = False Then
            strFilter = strFilter + " AND sop_number = '" & frm!sop & "'"""
        End If
        If IsNull(frm!dept) = False Then
            strFilter = strFilter + " AND department = '" & frm!dept & "'"
        End If
    **End If**
    Else
    If IsNull(frm!dept) = False Then
        strFilter = "department = '" & frm!dept & "'"
        If (IsNull(frm!employee) = False) Then
            strFilter = " AND Trainee_First_Name + ' ' +  Trainee_Last_Name = '" & frm!employee & "'"
        End If
        If IsNull(frm!sop) = False Then
            strFilter = strFilter + " AND sop_number = '" & frm!sop & "'"""
        End If
        If IsNull(frm!revision) = False Then
            strFilter = strFilter + " AND revision_number = '" & frm!revision & "'"
        End If
    **End If**
    End If
该代码避免在strFilter开头使用“AND”。然而,这种逻辑很难遵循,它在相同的基本主题上使用了多种变体

使用更简单的方法。您对4个表单控件中包含的值感兴趣:

  • frm!员工
  • frm!sop
  • frm!修订版
  • frm!部门
依次检查每个值,对于任何包含值的值,将以“and”开头的段添加到
strFilter
。之后,如果strFilter包含任何文本,您知道它以“AND”开头,因此您可以简单地丢弃前5个字符

strFilter=vbNullString“0”
strFilter=strFilter&_
“和受训者的名字&”“和受训者的姓&”_
frm!雇员&“”
如果结束
如果Len(Trim(frm!sop)&vbNullString)>0,则
strFilter=strFilter&“和sop_编号=”&frm!sop&“'”
如果结束
如果Len(Trim(frm!Revision)&vbNullString)>0,则
strFilter=strFilter&“和修订号='”&_
frm!修订版&“”
如果结束
如果Len(Trim(frm!dept)&vbNullString)>0,则
strFilter=strFilter&“部门=”&frm!部门&“”
如果结束
如果Len(strFilter)>0,则
从字符串开头的“discard”和“discard”
strFilter=Mid(strFilter,6)
如果结束

MsgBox“strFilter->”和strFilter&“我在Office 2010上使用它,没有任何问题。谢谢,蒂姆。我对你的答案投了更高的票,因为你帮助他理解了问题中的语句阻塞,我认为这是一件好事。两个答案在我看来都很有用。