You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA获取系统日期返回异常值问题:日期完全偏离实际非格式问题

问题根因

  • 核心错误出在INSERT语句的日期拼接语法不符合Access SQL规范,同时没有对VBA日期变量做统一格式化就直接拼接SQL,导致Access解析日期值时识别错误,最终写入错误的固定日期
  • 你在DCount校验逻辑里用了Access要求的#包裹日期值,但是INSERT语句里错误换成了单引号'包裹,会被Access识别为字符串而非日期类型,解析时出现格式适配错误
  • 未格式化的VBADate类型直接拼接SQL时,会受VBA本地区域格式、Access默认日期解析规则双重影响,大概率出现月/日顺序识别颠倒的问题,最终转换为错误日期值
  • 原代码中DoCmd.SendObject参数换行时缺少VBA续行符_,也会触发语法异常

修正方案

  1. 统一使用#包裹SQL中的日期值,符合Access SQL语法要求
  2. 拼接SQL前将日期变量统一格式化为yyyy-mm-dd的通用格式,避免区域格式干扰
  3. 用CurrentDb.Execute替代DoCmd.RunSQL,关闭系统提示同时避免SQL执行异常
  4. 对字符串类型的报表名称做单引号转义,避免报表名含特殊字符时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:57:02