Как проверить, что строка ГГГГММДД - это дата в Excel VBA? - PullRequest
0 голосов
/ 13 октября 2018

Дата указывается в виде строки в форме: 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

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Если введенная дата всегда в этом формате (ГГГГММДД), вы можете написать собственный код для преобразования его в строку, которую можно преобразовать в дату с помощью CDATE.

Не забудьте преобразовать месяц в имямесяц и год до четырехзначного года.Таким образом, вы явно определяете месяц, год и оставшийся месяц как дату, если вы сохраняете их как двузначные числа, они могут интерпретироваться по-разному в разностных системах (при преобразовании их с использованием CDATE)

Я рекомендуюэтот формат DD-MMM-YYYY

В вашем коде вместо

strToDate = CDate(dateStr)

Вы должны написать пользовательскую функцию

И вместо

formatDateYYYYMMDD= format(dateStr, dateFormat)

Вернуть только dateStr и установить формат ячейки, в которой она возвращается, ГГГГММДД

0 голосов
/ 13 октября 2018

Интересная идея для функции.Я переписал ваш код ниже, чтобы сделать именно то, что вы сказали.Функция возвращает «Не дата» для 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 голосов
/ 13 октября 2018

Возможно:

редактировать : исходный 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 выберет недопустимые датыкоторые в противном случае соответствуют критериям формата: например, 31 сентября, 30 февраля

...