如何验证YYYYMMDD字符串是Excel VBA中的日期?

问题描述 投票:1回答:3

日期以字符串形式提供: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
excel vba excel-vba date date-format
3个回答
4
投票

也许:

编辑:原始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日


2
投票

有趣的想法的功能。我已经重写了下面的代码,完全按照你的说法去做。函数返回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

0
投票

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

请记住将月份转换为月份名称,将年份转换为四位数年份。通过这种方式,您可以明确地将月份,年份和剩余的一个定义为日期,如果将它们保留为两位数字,则可以在差异系统上对它们进行不同的解释(使用CDATE进行转换时)

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

在你的代码而不是

strToDate = CDate(dateStr)

你必须编写一个自定义函数

代替

formatDateYYYYMMDD= format(dateStr, dateFormat)

返回dateStr并设置返回YYYYMMDD的单元格格式

© www.soinside.com 2019 - 2024. All rights reserved.