从字符串“MM / yyyy”到“日期”类型的转换无效

时间:2014-03-25 12:48:54

标签: vb.net vba date datetime

以下是代码,有关如何清除错误的想法吗?

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

1 个答案:

答案 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:据我所知,这仍然有效:

但我认为你需要解决你的第一个分支问题,如果'声明首先。

所有这一切,我根据代码/评论推断了你的很多意图。我可能完全不合适。