2014-03-25 204 views
0

下面是代码,尽管如何清除我的错误?从字符串“MM/yyyy”到“Date”类型的转换无效

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

你的错误是什么? – Jay

+0

为什么你将MonthsToAdd作为字符串传递?如果你需要一个Short,那么传入Short。 –

回答

0

我想我能发现两个潜在的问题:

在线:

sOldNMD = "20" & Right(OldNMD, 2) & Left(OldNMD, 2) & "01" 

如果你真的解析MMDD日期为您的评论说,你与你的约会清盘格式为:20DDMM01,我不认为这是你的意图,因为'if'语句的第二行保持原始的YYYYMMDD格式。在第一个'if'分支中,我看不到如何从输入字符串中获取YY片段,除非您默认为特定年份(YY)值。

因此'if'的第一个分支将重新格式化为无效的日期格式。

更新1:糟糕,以下是我的错误:忽略中间为零的部分。 此外,在您的线路:

CDate(Mid(sOldNMD, 5, 2) & "/1/" & Left(sOldNMD, 4)) 

相信中秋节假定在.NET中的0基指数,所以你想在你的MM片段的第二位置提取MM部分不第一。

尝试 CDATE(MID(sOldNMD,4,2)& “/ 1 /” &左(sOldNMD,4)) 代替。

更新2:这仍然矗立,从我可以告诉:

但我认为你需要先解决您的“如果”声明,即第一家分店。

所有这一切说,我推断你的许多意图基于代码/评论。我可能完全不符合标准。

+0

非常感谢您的帮助。此函数导致我出错:从字符串“MM/yyyy”转换为键入“Date”无效。我正在把这个代码从VB转换到Vb.Net。该功能将确定下个月到期。 – user3459688

+0

* OldNMD *输入参数的值是什么? – maelstrom

相关问题