Ms-Access:如何用DSum筛选本年记录并计算指定客户Standard总和?
解决Access文本框DSum筛选本年记录总和的问题
你遇到的问题核心是日期筛选的语法拼接错误,尤其是对Year()函数返回值的处理和字符串拼接格式的问题,我们一步步来修正:
错误原因分析
你之前尝试添加年份条件时,错误地用#包裹了年份数值(#是Access中用于包裹完整日期值的符号,而年份是整数,不需要),同时字符串拼接的逻辑也有疏漏,导致Access无法识别表达式,进而出现Name?或Error错误。
正确的DSum表达式
针对你的需求,正确的表达式应该是:
=DSum("[Standard]", "Training", "[Client] = '" & [Client] & "' AND Year([Date]) = " & Year(Date()))
关键细节说明:
- 字段名转义:你的日期字段名为
Date,这是Access的保留字,必须用方括号[Date]括起来,避免语法冲突。 - 年份比较逻辑:
Year([Date])提取记录中日期的年份,Year(Date())获取当前系统年份,两者都是整数类型,直接用=比较即可,不需要额外的日期分隔符。 - 字符串拼接:确保
AND条件包含在筛选字符串中,并且引号和连接符&的位置正确,保证整个筛选条件是一个完整的字符串。
更高效的替代写法(推荐)
如果你的Training表中Date字段有索引,使用日期范围筛选会比Year()函数更高效(Access可以利用索引快速定位记录):
=DSum("[Standard]", "Training", "[Client] = '" & [Client] & "' AND [Date] >= DateSerial(Year(Date()), 1, 1) AND [Date] <= DateSerial(Year(Date()), 12, 31)")
DateSerial(Year(Date()), 1, 1)会生成当前年份的1月1日,DateSerial(Year(Date()), 12, 31)生成当前年份的12月31日,这样精准限定了本年的日期范围。
验证你的示例数据
用正确的表达式计算时:
- Client A的2018年记录是
1和2,总和为3,完全符合你的需求; - 会自动忽略2017年的记录和其他客户的本年记录。
内容的提问来源于stack exchange,提问作者Matt Jenkins




