日期以字符串形式提供:20180503
该函数应该验证该条目是:
YYYYMMDD
的形式以下代码不起作用:
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日
有趣的想法的功能。我已经重写了下面的代码,完全按照你的说法去做。函数返回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
如果输入日期始终采用此格式(YYYYMMDD),则可以编写自定义代码以将其转换为可使用CDATE转换为日期的字符串。
请记住将月份转换为月份名称,将年份转换为四位数年份。通过这种方式,您可以明确地将月份,年份和剩余的一个定义为日期,如果将它们保留为两位数字,则可以在差异系统上对它们进行不同的解释(使用CDATE进行转换时)
我推荐这种格式DD-MMM-YYYY
在你的代码而不是
strToDate = CDate(dateStr)
你必须编写一个自定义函数
代替
formatDateYYYYMMDD= format(dateStr, dateFormat)
返回dateStr并设置返回YYYYMMDD的单元格格式