以下是代码,有关如何清除错误的想法吗?
Public Function AddNextMonthDue(ByRef OldNMD As String, ByRef MonthsToAdd As String) As String
Dim dOldNMD As Date
Dim dNewNMD As Date
Dim sOldNMD As String
If Len(OldNMD) = 4 Then ' MMDD format
sOldNMD = "20" & Right(OldNMD, 2) & Left(OldNMD, 2) & "01"
Else
sOldNMD = OldNMD ' YYYYMMDD format
End If
dOldNMD = CDate(Mid(sOldNMD, 5, 2) & "/1/" & Left(sOldNMD, 4))
dNewNMD = DateAdd(Microsoft.VisualBasic.DateInterval.Month, CShort(MonthsToAdd),dOldNMD)
AddNextMonthDue = Format(CDate(dNewNMD), "MMyy")
End Function
答案 0 :(得分:0)
我想我可以发现两个潜在的问题:
在线:
sOldNMD = "20" & Right(OldNMD, 2) & Left(OldNMD, 2) & "01"
如果您正在解析MMDD日期正如您的评论所说,您将以20DDMM01格式结束您的日期,我不认为这是您想要的,因为&#的第二行39;如果'声明保持原始的YYYYMMDD格式。在第一个' if'分支,我不知道如何从输入字符串中获取YY片段,除非您默认为特定年份(YY)值。
所以' if'的第一个分支。正在重新格式化为无效的日期格式。
更新1:哎呀,以下是我的错误:忽略关于Mid从零开始的部分。 另外,在你的行中:
CDate(Mid(sOldNMD, 5, 2) & "/1/" & Left(sOldNMD, 4))
我相信 Mid在.NET中假定0基本索引,因此您尝试在MM片段的第二个位置提取MM部分,而不是第一个。
尝试 CDate(Mid(sOldNMD,4,2)&" / 1 /"& Left(sOldNMD,4)) 代替。
更新2:据我所知,这仍然有效:
但我认为你需要解决你的第一个分支问题,如果'声明首先。
所有这一切,我根据代码/评论推断了你的很多意图。我可能完全不合适。