【问题标题】:How do I validate a YYYYMMDD string is a date in Excel VBA?如何验证 YYYYMMDD 字符串是 Excel VBA 中的日期?
【发布时间】:2019-03-18 09:56:05
【问题描述】:

日期以字符串形式提供,格式为:20180503

该函数应该验证条目是:

  1. 形式为YYYYMMDD
  2. 有效日期

以下代码不能解决问题:

Function formatDateYYYYMMDD(dateStr As String, dateFormat As String) As String
    Dim strToDate As Date
    strToDate = CDate(dateStr)
     If IsDate(strToDate) Then
        formatDateYYYYMMDD= format(dateStr, dateFormat)
     Else
        formatDateYYYYMMDD= "Not a date"
     End If
End Function

【问题讨论】:

  • 从技术上讲,20181013 在 Excel 中不是有效日期。 . . .如果这是在Excel中输入数据,强烈建议您实际上确实使用有效日期输入格式,否则你会经常回到这里,遇到与非标准日期格式相关的问题。 最好使用的格式是yyyy-mm-ddISO-8601 国际标准,出于多种原因,这种格式最有意义。
  • 不幸的是,数据来自提要。我应该验证条目是 YYYYMMDD 格式。
  • @ashleedawg - 我的理解是 ISO 8601 确实允许删除分隔符,但这不是首选用法,因此 20181013 是规范的一部分。

标签: excel vba date date-format


【解决方案1】:

也许:

编辑:原始 UDF 已更改,因为它不会标记某些无效格式日期。

Option Explicit
Function formatDateYYYYMMDD(dateStr As String, dateformat As String) As String
    Dim strToDate As Date
On Error GoTo invalidDate
If Len(dateStr) = 8 And _
    Left(dateStr, 4) > 1900 And _
    Mid(dateStr, 5, 2) <= 12 And _
    Right(dateStr, 2) <= 31 Then
        formatDateYYYYMMDD = Format(CDate(Format(dateStr, "0000-00-00")), dateformat)
    Exit Function
End If
invalidDate: formatDateYYYYMMDD = "Not a date"
End Function

On Error 将选取在其他方面符合格式标准的无效日期:例如,9 月 31 日、2 月 30 日

【讨论】:

  • 谢谢罗恩。为我的目的而工作!
  • @ibexy 抱歉,我没有进行足够的故障排除。原件没有充分验证格式。我编辑了我的帖子以提供更强大的解决方案。有问题请查收。
  • 以前的版本也可以处理无效日期,比如 19902323。我已经实现了新版本,效果也很好。感谢您的帮助!
  • @ibexy 但不是 120808
【解决方案2】:

如果输入日期始终采用这种格式(YYYYMMDD),您可以编写自定义代码将其转换为可以使用 CDATE 转换为日期的字符串。

请记住将月份转换为月份名称,并将年份转换为四位数年份。通过这种方式,您将月份、年份和剩余的日期明确定义为日期,如果您将它们保留为两位数,则它们在不同系统上的解释可能会有所不同(当您使用 CDATE 转换它们时)

我推荐这种格式 DD-MMM-YYYY

在您的代码中,而不是

strToDate = CDate(dateStr)

你必须写一个自定义函数

代替

formatDateYYYYMMDD= format(dateStr, dateFormat)

仅返回 dateStr 并将其返回的单元格的格式设置为 YYYYMMDD

【讨论】:

    【解决方案3】:

    一个有趣的想法。我已经在下面重写了您的代码,以完全按照您所说的去做。函数返回 2018101a、20181033、201810300 的“不是日期”,否则返回格式化字符串中的日期。请注意,您需要提供有效的字符串格式,而我没有处理该错误。我假设最后没有空格?

    Function formatDateYYYYMMDD(dateStr As String, dateFormat As String) As String
    Dim strToDate As Date
    Dim day As Integer
    Dim month As Integer
    Dim year As Integer
    
    On Error Resume Next
    
    year = Left(dateStr, 4)
    month = Mid(dateStr, 5, 2)
    day = Right(dateStr, 2)
    
    strToDate = DateSerial(year, month, day)
    If Err.Number <> 0 Or Len(dateStr) <> 6 Then
        formatDateYYYYMMDD = "Not a date"
        Err.Clear
        On Error GoTo 0
    Else
        On Error GoTo 0
        formatDateYYYYMMDD = Format(strToDate, dateFormat)
    End If
    
    End Function
    

    【讨论】:

      【解决方案4】:

      我从那家伙的建议中获得了一些指示,我修改了代码,现在它可以工作了。谢谢大家的意见。

      这就是我所做的

      sValue = frmForm.txtSearch.Value
      
      If IsDate(sValue) Then
          'do nothing
      Else
      sValue = Format(frmForm.txtSearch.Value, "DD-MM-YYYY")
      End If
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-25
        • 2018-05-31
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多