2014-03-25 188 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

相關問題