日期以字符串形式提供:13/10/2018
该功能应验证条目是否为
20180503
形式以下代码无法解决问题:
YYYYMMDD
答案 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