【问题标题】:Conversion from string "MM/yyyy" to type 'Date' is not valid从字符串“MM/yyyy”到类型“日期”的转换无效
【发布时间】:2014-05-03 07:54:07
【问题描述】:

这是代码,有什么想法可以清除我的错误吗?

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

【问题讨论】:

  • 你为什么将 MonthsToAdd 作为字符串传递?如果您需要 Short,请传入 Short。

标签: vb.net vba date datetime


【解决方案1】:

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

在线:

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

如果您真的按照评论所说的那样解析 MMDD 日期,那么您的日期将采用以下格式:20DDMM01,我认为这不是您想要的,因为“if”语句的第二行保持原来的 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:据我所知,这仍然存在:

但我认为您需要先解决“if”语句的第一个分支。

说了这么多,我根据代码/cmets 推断出很多你的意图。我可能完全不合时宜。

【讨论】:

  • 非常感谢您的帮助。此函数导致我出现错误:从字符串“MM/yyyy”到类型“日期”的转换无效。我正在将此代码从 VB 转换为 Vb.Net。此函数将确定下个月到期。
  • OldNMD 输入参数的值是多少?
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多