使用EoMonth函数返回1900日期问题及替代实现方法咨询
EoMonth函数返回1900年日期的替代解决方案
在Excel VBA中使用EoMonth函数时,无法生成预期日期,反而返回1900年的错误日期。尝试过WorksheetFunction.EoMonth、Application.WorksheetFunction.EoMonth和Application.EoMonth三种调用方式,均无法正确填充Excel文档,现寻求实现EoMonth功能的替代方法。
现有VBA代码示例
Case "Group 1" If Day(DOH + 60) = 1 Then GracePeriod = DOH + 60 Else GracePeriod = (WorksheetFunction.EoMonth(DOH + 60, 0) + 1) End If Case "Group 2" If Day(DOH + 30) = 1 Then GracePeriod = DOH + 30 Else GracePeriod = Application.EoMonth(DOH + 30, 0) - 0 End If Case "Group 3" If Day(DOH + 30) = 1 Then GracePeriod = DOH + 30 Else GracePeriod = DateSerial(Year(DOH + 30), Month(DOH + 30) + 1, 1) End If
错误现象截图

替代解决方案
1. 用DateSerial手动实现月末/月初计算
EoMonth的核心逻辑是获取指定日期所在月份的最后一天,完全可以通过DateSerial函数手动实现,避免调用工作表函数可能出现的类型错误:
- 获取某日期所在月份的最后一天:
DateSerial(Year(targetDate), Month(targetDate) + 1, 0)(下个月的第0天即为当月最后一天) - 获取某日期所在月份的下一个月第一天:
DateSerial(Year(targetDate), Month(targetDate) + 1, 1)
针对现有代码修改后的版本:
Case "Group 1" Dim tempDate1 As Date tempDate1 = DOH + 60 If Day(tempDate1) = 1 Then GracePeriod = tempDate1 Else ' 取tempDate1所在月的月末,再加1得到下月第一天 GracePeriod = DateSerial(Year(tempDate1), Month(tempDate1) + 1, 0) + 1 End If Case "Group 2" Dim tempDate2 As Date tempDate2 = DOH + 30 If Day(tempDate2) = 1 Then GracePeriod = tempDate2 Else ' 取tempDate2所在月的月末 GracePeriod = DateSerial(Year(tempDate2), Month(tempDate2) + 1, 0) End If Case "Group 3" ' 原有逻辑已经是用DateSerial实现,可保留,建议增加临时变量提升可读性 Dim tempDate3 As Date tempDate3 = DOH + 30 If Day(tempDate3) = 1 Then GracePeriod = tempDate3 Else GracePeriod = DateSerial(Year(tempDate3), Month(tempDate3) + 1, 1) End If
2. 排查DOH变量类型问题
出现1900年错误日期,大概率是DOH变量不是有效的Date类型,或者DOH + 60/30的计算结果变成了非日期值,导致工作表函数返回错误值(如#VALUE!),而Excel会将错误值转换为极小的数值,显示为1900年的日期。可以在代码开头增加类型校验:
If Not IsDate(DOH) Then MsgBox "DOH不是有效的日期值" Exit Sub ' 或其他错误处理逻辑 End If
内容的提问来源于stack exchange,提问作者alxn
相关产品推荐
相关产品推荐

