VBA获取系统日期返回异常值问题:日期完全偏离实际非格式问题
问题根因
- 核心错误出在INSERT语句的日期拼接语法不符合Access SQL规范,同时没有对VBA日期变量做统一格式化就直接拼接SQL,导致Access解析日期值时识别错误,最终写入错误的固定日期
- 你在
DCount校验逻辑里用了Access要求的#包裹日期值,但是INSERT语句里错误换成了单引号'包裹,会被Access识别为字符串而非日期类型,解析时出现格式适配错误 - 未格式化的VBA
Date类型直接拼接SQL时,会受VBA本地区域格式、Access默认日期解析规则双重影响,大概率出现月/日顺序识别颠倒的问题,最终转换为错误日期值 - 原代码中
DoCmd.SendObject参数换行时缺少VBA续行符_,也会触发语法异常
修正方案
- 统一使用
#包裹SQL中的日期值,符合Access SQL语法要求 - 拼接SQL前将日期变量统一格式化为
yyyy-mm-dd的通用格式,避免区域格式干扰 - 用
CurrentDb.Execute替代DoCmd.RunSQL,关闭系统提示同时避免SQL执行异常 - 对字符串类型的报表名称做单引号转义,避免报表名含特殊字符时SQL语法报错
修正后代码如下:
Dim strFile As String Dim strTo As String Dim strSubject As String Dim strBody As String Dim InReport As String Dim InDate As Date Dim strSQL As String strFile = Forms!frmMain!strFile strTo = "email" strSubject = "subject" strBody = "body" InReport = "ReportName" InDate = Date ' 校验时格式化日期避免解析错误 If DCount("*", "tblEmailTracking", "[SentDate]=#" & Format(InDate, "yyyy-mm-dd") & "#") > 0 Then Exit Sub Else '发送邮件 DoCmd.OpenReport "ReportName", acViewPreview, , , acHidden Reports("ReportName").Caption = strFile ' 补全VBA续行符避免语法错误 DoCmd.SendObject acSendReport, "ReportName", acFormatPDF, strTo, strCC, , _ strSubject, strBody, False ' 拼接规范的INSERT语句 strSQL = "INSERT INTO tblEmailTracking(SentDate, SentReport) VALUES(#" & Format(InDate, "yyyy-mm-dd") & "#, '" & Replace(InReport, "'", "''") & "');" CurrentDb.Execute strSQL, dbFailOnError DoCmd.Close acReport, "ReportName" End If
内容的提问来源于stack exchange,提问作者doigr
相关产品推荐
相关产品推荐

