Access VBA运行时错误3464:日期相关条件表达式数据类型不匹配
Access运行时错误3464:数据类型不匹配问题排查与修复
问题场景
两台安装同版本(Microsoft® Access® for Microsoft 365 MSO 2410 Build 16.0.18129.20100 64位)Access的电脑,打开同一.accdb文件时,一台正常运行自定义代码,另一台触发:
运行时错误'3464':条件表达式中数据类型不匹配
无论文件存放在U盘还是本地硬盘,问题均存在。该代码用于查询周ID并定位到表单对应记录,原代码如下:
Private Sub Form_Open(Cancel As Integer) Dim WID As Integer Dim rst As DAO.Recordset Dim strSQL As String Dim curday As Date strSQL = "SELECT tblWeeks.ID FROM tblWeeks WHERE (((DateValue(Now())) Between [Weekstartdate] And [weekenddate]));" Set rst = CurrentDb.OpenRecordset(strSQL) WeekIDSQL = rst!ID cmbWeekSelector = WeekIDSQL DoCmd.SearchForRecord acDataForm, "frmTimesheet", acFirst, "[ID] = " & WeekIDSQL End Sub
核心原因分析
- SQL语法错误:原
strSQL末尾存在多余的转义引号",导致SQL语句解析失败。 - 日期格式区域差异:两台电脑系统日期格式(如
yyyy/mm/ddvsmm/dd/yyyy)不同,Access对DateValue(Now())的解析结果与Weekstartdate/weekenddate的类型匹配出现问题。 - 变量未声明:
WeekIDSQL未明确声明类型,默认Variant可能引发隐式类型转换错误。 - 无空记录处理:如果当前日期不在任何周区间内,
rst!ID会直接报错,同时DoCmd.SearchForRecord的条件拼接也可能因类型不匹配触发3464错误。
修复后的代码
Private Sub Form_Open(Cancel As Integer) Dim WID As Integer Dim rst As DAO.Recordset Dim strSQL As String Dim curday As Date Dim WeekIDSQL As Variant ' 明确声明变量类型 curday = Date ' 直接获取当前日期,替代DateValue(Now())更高效 ' 修复SQL语法,用参数化查询避免日期格式问题 strSQL = "SELECT tblWeeks.ID FROM tblWeeks WHERE [Weekstartdate] <= ? AND [weekenddate] >= ?;" Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) rst.MoveFirst ' 用参数匹配当前日期,规避区域格式差异 rst.FindFirst "[Weekstartdate] <= ? AND [weekenddate] >= ?", , , curday, curday If Not rst.NoMatch Then WeekIDSQL = rst!ID cmbWeekSelector = WeekIDSQL ' 注意:如果frmTimesheet的ID是文本类型,需改为 "[ID] = '" & WeekIDSQL & "'" DoCmd.SearchForRecord acDataForm, "frmTimesheet", acFirst, "[ID] = " & Nz(WeekIDSQL, 0) Else ' 处理无匹配记录的情况,避免崩溃 MsgBox "未找到当前日期对应的周记录", vbInformation Cancel = True ' 可选:取消表单打开 End If ' 清理对象 rst.Close Set rst = Nothing End Sub
额外排查步骤
- 统一系统日期格式:在两台电脑的「控制面板-区域设置」中,将短日期格式设置为完全一致(如
yyyy-MM-dd),重启Access后测试。 - 验证字段类型:确认
tblWeeks表中Weekstartdate、weekenddate为「日期/时间」类型,ID为「数字」类型;同时frmTimesheet绑定的ID字段类型需与tblWeeks.ID完全匹配。 - 添加错误捕获定位:给代码加上错误捕获,精准定位出错行:
Private Sub Form_Open(Cancel As Integer) On Error GoTo ErrorHandler ' 原有修复后的代码... ExitHandler: If Not rst Is Nothing Then rst.Close Set rst = Nothing End If Exit Sub ErrorHandler: MsgBox "错误编号:" & Err.Number & vbCrLf & "错误描述:" & Err.Description & vbCrLf & "出错行:" & Erl Resume ExitHandler End Sub
内容的提问来源于stack exchange,提问作者Andy H
相关产品推荐
相关产品推荐

