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

How do I validate a YYYYMMDD string is a date in Excel VBA?

日期以字符串的形式提供: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

也许:

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

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

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

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

在您的代码中而不是

strToDate = CDate(dateStr)

你必须写一个自定义函数

代替

formatDateYYYYMMDD= format(dateStr, dateFormat)

Return 只是 dateStr 并将返回它的单元格的格式设置为 YYYYMMDD

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

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

我根据这个人的建议修改了代码,现在可以使用了。谢谢大家的意见。

这就是我所做的

sValue = frmForm.txtSearch.Value

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