相同的ApplyFilter代码适用于报表加载,但在表单按钮上失败

时间:2018-05-29 20:35:58

标签: vba ms-access access-vba ms-access-2010

我正在处理一个根据出生日期筛选查询数据的表单。应该很简单。起初我打算将其作为报告,但决定表格会更好。在报告中,我的过滤器代码工作正常;它会检查选择表单上未绑定框的值并相应地进行过滤。像这样:

Private Sub Report_Load()

Dim start_dob As String
Dim end_dob As String

If CurrentProject.AllForms("frm_Birth_range_selector").IsLoaded = True Then
    start_dob = Forms!frm_Birth_range_selector!txt_DOB_start
    end_dob = Forms!frm_Birth_range_selector!txt_DOB_end
    Me.FilterOn = True
    DoCmd.ApplyFilter , "DOB >= '" & start_dob & "' and DOB <= '" & end_dob & "'"
End If

End Sub

我尝试在表单上执行相同的操作,使用未绑定的框本身和一个按钮来应用过滤器。相同的查询。相同的代码,但引用不同的框。相同的盒子属性,我甚至尝试从选择器表单复制粘贴框,以确保我没有错过任何东西。此代码返回运行时3464错误Data type mismatch in criteria expression错误:

Private Sub Command33_Click()

Dim start_dob As String
Dim end_dob As String

start_dob = Me.txt_DOB_start
end_dob = Me.txt_DOB_end
Me.FilterOn = True
DoCmd.ApplyFilter , "DOB >= '" & start_dob & "' and DOB <= '" & end_dob & "'"

End Sub

我尝试用Me.替换Forms!frm_birth_log!。没有变化。

1 个答案:

答案 0 :(得分:1)

此错误可能与日期有关 - 如果日期为&gt; 12,您的代码可能无法正常工作,因为日期应采用美国格式。使用这样的东西:

Private Sub Command33_Click()
    Dim start_dob As Date
    Dim end_dob As Date

    If IsDate(Me.txt_DOB_start) And IsDate(Me.txt_DOB_end) Then
        start_dob = CDate(Me.txt_DOB_start)
        end_dob = CDate(Me.txt_DOB_end)
        Me.Filter = "DOB >= #" & Format(start_dob, "mm\/dd\/yyyy") & "# and DOB <= #" & Format(end_dob, "mm\/dd\/yyyy") & "#"
        Me.FilterOn = True
    Else
        MsgBox "Invalid date"
    End If
End Sub

我建议在每个模块中始终使用Option Explicit指令。使用此指令编译器会给您一个错误,因为您声明了send_dob并使用了end_dob。这种错误有时会导致不可预测的结果,很难找到。