1. 问题与结论
在按月测算固定资产折旧或无形资产摊销时,常见需求并不是计算两个日期之间经过了多少个“完整月”,而是计算两个日期所在月份之间相隔了多少个自然月。
例如,某项固定资产于 2022 年 12 月 31 日开始使用,2023 年 6 月 30 日为本期期末。按照“当月增加、下月计提折旧”的口径,2023 年 1 月至 6 月共应计提 6 个月折旧。
但是,DATEDIF 函数计算的是两个日期之间的完整年、完整月或天数:
| 开始日期 | 结束日期 | 公式 | 结果 |
|---|---|---|---|
| 2022-12-31 | 2023-06-30 | =DATEDIF(DATE(2022,12,31),DATE(2023,6,30),"M") |
5 |
这里的 5 并不是 Excel 算错了,而是计算口径不匹配:
DATEDIF(...,"M")回答的是“两个日期之间有多少个完整月”;- 折旧测算需要的是“从开始使用月份的次月到本期期末月份共有多少个月”。
因此,按自然月测算时,建议忽略日期中的“日”,使用以下公式计算月份差:
=(YEAR([结束日期])-YEAR([开始日期]))*12+MONTH([结束日期])-MONTH([开始日期])
代入上述日期,结果为:
(2023-2022)×12+6-12=6
在线文档示例: 点击查看
2. 为什么 DATEDIF 返回 5
微软将 DATEDIF 定义为计算两个日期之间的天数、月数或年数;其中参数 "M" 返回期间内的完整月数。
从 2022 年 12 月 31 日起算,到 2023 年 5 月 31 日已经经过 5 个完整月;到 2023 年 6 月 30 日时,因为尚未到达当月 31 日,所以不再增加一个完整月,结果仍为 5。
这也说明了为什么不宜用 DATEDIF(...,"M") 直接计算折旧或摊销月份:DATEDIF 会比较“日”,而按自然月计提的折旧或摊销通常只需要比较“年”和“月”。
微软还说明,DATEDIF 是为了兼容 Lotus 1-2-3 的旧工作簿而提供的函数,并提示它在某些场景中可能产生不准确的结果。微软明确列出的已知问题主要涉及 "MD" 参数。本文不把 5 归类为该已知问题,而将其视为完整月口径与自然月口径的差异。
3. 公式的适用前提
以下公式适用于同时满足这些条件的测算:
- 执行企业会计准则,按月计提;
- 采用年限平均法(直线法);
- 使用年限以“年”录入,乘以 12 后能够得到使用寿命月数;
- 不考虑资产减少、终止确认、减值、使用寿命变更、残值变更等特殊事项;
[本期期初日期]为本期第一个月份内的日期,[本期期末日期]为本期最后一个月份内的日期。
其中:
- 固定资产的
[开始使用日期],应理解为固定资产达到预定可使用状态并增加的日期;以下公式从次月开始计算折旧; - 无形资产的
[开始使用日期],应理解为无形资产可供使用的日期;以下公式假设可供使用当月计提一个整月摊销。
《企业会计准则第 4 号——固定资产》应用指南规定,固定资产应当按月计提折旧,当月增加的固定资产当月不计提、从下月起计提;当月减少的固定资产当月仍计提、从下月起不计提。《企业会计准则第 6 号——无形资产》第十七条规定,企业摊销无形资产应当自无形资产可供使用时起,至不再作为无形资产确认时止。
注意: 如果企业对无形资产可供使用首月或终止确认当月按实际天数摊销,以下“当月计一个整月”的公式并不适用,应按照企业的会计政策另行计算。
《【示例】固定资产(不含减值)年限平均法折旧测算公式》在线文档: 点击查看
4. 公式解析
下文用方括号表示字段,例如 [开始使用日期]。实际使用时,请根据工作簿结构替换为单元格引用、已定义名称或 Excel 表的结构化引用。
4.1. 月份差的基本公式
可以把每个自然月理解为一个连续的“月序号”:
=YEAR([日期])*12+MONTH([日期])
两个日期所在月份的差,就是两个“月序号”相减:
=(YEAR([结束日期])-YEAR([开始日期]))*12+MONTH([结束日期])-MONTH([开始日期])
该公式不读取日期中的“日”,所以 2022 年 12 月 1 日、12 月 30 日或 12 月 31 日的月序号完全相同。
4.2. 固定资产年限平均法
| 项目 | 公式 |
|---|---|
| 累计折旧月份 | =MIN([使用年限]*12,MAX(0,(YEAR([本期期末日期])-YEAR([开始使用日期]))*12+MONTH([本期期末日期])-MONTH([开始使用日期]))) |
| 上期末累计折旧月份 | =MIN([使用年限]*12,MAX(0,(YEAR(EOMONTH([本期期初日期],-1))-YEAR([开始使用日期]))*12+MONTH(EOMONTH([本期期初日期],-1))-MONTH([开始使用日期]))) |
| 本期折旧月份 | =[累计折旧月份]-[上期末累计折旧月份] |
公式中:
MAX(0,...)防止本期期末早于开始使用月份时出现负数;MIN([使用年限]*12,...)防止累计折旧月份超过使用寿命;EOMONTH([本期期初日期],-1)取得本期期初日期的上月末,用于计算本期以前的累计折旧月份;- 本期折旧月份等于“本期期末累计月份-上期末累计月份”。
在不考虑减值和会计估计变更时,还可以据此测算金额:
月折旧额=([固定资产原价]-[预计净残值])/([使用年限]*12)
本期折旧额=[月折旧额]*[本期折旧月份]
4.3. 无形资产直线法
| 项目 | 公式 |
|---|---|
| 累计摊销月份 | =IF([本期期末日期]<[开始使用日期],0,MIN([使用年限]*12,(YEAR([本期期末日期])-YEAR([开始使用日期]))*12+MONTH([本期期末日期])-MONTH([开始使用日期])+1)) |
| 上期末累计摊销月份 | =IF(EOMONTH([本期期初日期],-1)<[开始使用日期],0,MIN([使用年限]*12,(YEAR(EOMONTH([本期期初日期],-1))-YEAR([开始使用日期]))*12+MONTH(EOMONTH([本期期初日期],-1))-MONTH([开始使用日期])+1)) |
| 本期摊销月份 | =[累计摊销月份]-[上期末累计摊销月份] |
无形资产公式中的 +1 表示把可供使用的当月计入摊销月份。前置的 IF 判断用于处理本期期末早于可供使用日期的情况,特别是两个日期处于同一月份但期末日期更早时,防止误计 1 个月。
例如,同样以 2022 年 12 月 31 日为开始使用日期、2023 年 6 月 30 日为期末:
| 测算对象 | 计提区间 | 累计月份 |
|---|---|---|
| 固定资产 | 2023 年 1 月至 6 月 | 6 |
| 无形资产 | 2022 年 12 月至 2023 年 6 月 | 7 |
因此,不能把同一个“月份差”结果同时直接用作固定资产折旧月份和无形资产摊销月份。
在不考虑减值和会计估计变更时,无形资产摊销额可按下式测算:
月摊销额=([无形资产成本]-[预计残值])/([使用年限]*12)
本期摊销额=[月摊销额]*[本期摊销月份]
使用寿命有限的无形资产,其残值通常视为零,但企业会计准则规定的例外情形除外。
4.4. 空值与异常值保护
Excel 会把空白日期用于日期函数计算,从而可能得到看似正常、实际错误的结果。正式用于底稿时,建议先判断必填字段是否为空。例如:
=IF(
OR([使用年限]="",[开始使用日期]="",[本期期末日期]=""),
"",
[累计月份核心公式]
)
同时建议通过数据验证或复核规则检查:
- 使用年限大于 0,且换算后的使用寿命月数为整数;
- 开始使用日期、本期期初日期和本期期末日期均为真正的 Excel 日期,而不是文本;
- 本期期初日期不晚于本期期末日期;
- 存在资产减少、终止确认、减值或估计变更时,不直接套用本文公式。
5. 验证用例
完成公式后,可以至少使用以下边界情形进行验证:
| 场景 | 开始使用日期 | 本期期末日期 | 预期累计月份 |
|---|---|---|---|
| 固定资产跨年、月末日不同 | 2022-12-31 | 2023-06-30 | 6 |
| 固定资产本月开始使用 | 2023-06-01 | 2023-06-30 | 0 |
| 无形资产本月可供使用 | 2023-06-30 | 2023-06-30 | 1 |
| 无形资产尚未达到可供使用日期 | 2023-06-30 | 2023-06-01 | 0 |
| 期末早于开始使用月份 | 2023-07-01 | 2023-06-30 | 0 |
| 已超过 1 年使用寿命 | 2022-01-01 | 2023-06-30 | 不超过 12 |
6. 常见问题
6.1. 能否用日期相减后除以 30
不能。公历月份的天数不同,期间越长,累计误差越明显。
以 2012 年 12 月 31 日至 2023 年 6 月 30 日为例:
| 方法 | 公式 | 结果 | 说明 |
|---|---|---|---|
| 日期差除以 30 | =(DATE(2023,6,30)-DATE(2012,12,31))/30 |
约 127.77 | 不是整数,四舍五入后为 128 |
| 自然月份差 | =(YEAR(DATE(2023,6,30))-YEAR(DATE(2012,12,31)))*12+MONTH(DATE(2023,6,30))-MONTH(DATE(2012,12,31)) |
126 | 固定资产从次月计提时的累计月份 |
在线文档示例: 点击查看
6.2. 如果仍想使用 DATEDIF,应该怎么写
先用 DATE 函数把开始日期和结束日期都转换为各自月份的第一天,再计算完整月数:
=DATEDIF(DATE(YEAR([开始日期]),MONTH([开始日期]),1),DATE(YEAR([结束日期]),MONTH([结束日期]),1),"M")
因为两个日期的“日”都是 1,DATEDIF 的结果就等于自然月份差。若用于本文假设下的无形资产摊销月份,再在结果后加 1,并使用 MIN、MAX 限制上下界。
与 DATEDIF(TEXT([开始日期],"YYYY-MM"),TEXT([结束日期],"YYYY-MM"),"M") 相比,DATE 写法直接构造真正的日期序列值,不依赖 Excel 对 "YYYY-MM" 文本的隐式日期解析,跨区域设置使用时更稳健。
6.3. DATEDIF 函数如何使用
详见:DATEDIF 函数用法。