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

时间:2018-10-13 10:17:56

标签: excel vba date date-format

日期以字符串形式提供:13/10/2018

该功能应验证条目是否为

  1. 采用20180503形式
  2. 有效日期

以下代码无法解决问题:

YYYYMMDD

4 个答案:

答案 0 :(得分: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日

答案 1 :(得分: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

答案 2 :(得分:1)

我摆弄了代码,从家伙的建议中得到了一些指导,它现在可以工作了。谢谢大家的投入。

这就是我所做的

sValue = frmForm.txtSearch.Value

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

答案 3 :(得分:0)

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

记住将月份转换为月份名称,将年份转换为四位数年份。这样,您可以将月,年和剩余的一个明确定义为日期,如果将它们保留为两位数,则它们在不同系统上的解释可能会有所不同(使用CDATE进行转换时)

我建议使用这种格式DD-MMM-YYYY

用您的代码代替

strToDate = CDate(dateStr)

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

代替

formatDateYYYYMMDD= format(dateStr, dateFormat)

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