Формат даты VBA для переменной - PullRequest
1 голос
/ 12 марта 2019

Мне нужно превратить содержимое столбца электронной таблицы из текста в дату.

Формат ячейки: текст , и вводные данные были заданы для ввода даты в виде "ddmmyyyy".

Произошли несчастные случаи, и я обнаружил некоторый контент, который не будет обрабатываться как дата, включая записи типа «Неизвестно».

Поэтому я использовал переменную, объявленную как дату, и написал обработчик ошибок для обработкисодержимое, которое не будет анализироваться.

Теперь для бита, который я не могу обработать.

Если дата была 3 марта 2000 года, и кто-то вводил это как "03332000", то это не будет анализироваться, потому что "33"не может быть месяц или день;он перехватывается обработчиком ошибок так, как я хотел.

Но если он был введен как «03132000», я не могу придумать, как предотвратить преобразование VBA в действительную дату как «13/03/2000»".

Объявление формата для переменной даты не помешает VBA анализировать дату.

Я могу написать что-то, что проверяет диапазон чисел части дня и месяца строки, но это лишнеестрок кода, и я надеялся сделать это просто обработчиком ошибок.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Я бы подошел к этому немного по-другому, и пусть Excel сделает всю работу.

Public Function ValidateDate(ByVal strDate As String) As Boolean
    Dim intDay As Integer, intMonth As Integer, intYear As Integer, dtDate As Date

    ValidateDate = True

    On Error GoTo IsInValid

    If Len(strDate) <> 8 Then GoTo IsInValid
    If Not IsNumeric(strDate) Then GoTo IsInValid

    intDay = Left(strDate, 2)
    intMonth = Mid(strDate, 3, 2)
    intYear = Right(strDate, 4)

    dtDate = DateSerial(intYear, intMonth, intDay)

    If DatePart("d", dtDate) <> intDay Then GoTo IsInValid
    If DatePart("m", dtDate) <> intMonth Then GoTo IsInValid
    If DatePart("yyyy", dtDate) <> intYear Then GoTo IsInValid

    Exit Function

IsInValid:
    ValidateDate = False

End Function

... это обеспечит правильную работу всего, что связано с високосными годами и т. Д., И правильность проверки всех записей.

enter image description here

0 голосов
/ 12 марта 2019

Если вы разместите:

03332000

в ячейке A1 и запуск:

Sub CheckDate()
    Dim s As String, d As Date
    s = Range("A1").Text
    d = DateSerial(CInt(Right(s, 4)), CInt(Mid(s, 3, 2)), CInt(Left(s, 2)))
    MsgBox s & vbCrLf & d
End Sub

Вы получите:

enter image description here

Таким образом, хотя допустимый месяц может быть только в диапазоне [1-12], Excel пытается «помочь» вам, интерпретируя 33 как проекцию будущей даты. Например, если месяц был введен как 13, Excel будет обрабатывать его как декабрь следующего года!

Вы не можете полагаться на обработку ошибок для этого. Вам нужны чеки, такие как:

Sub CheckDate2()
    Dim s As String, d As Date
    Dim dd As Integer, mm As Integer, yr As Integer

    s = Range("A1").Text

    yr = CInt(Right(s, 4))
    mm = CInt(Mid(s, 3, 2))
    dd = CInt(Left(s, 2))

    If yr = 0 Or yr < 1900 Then
        MsgBox "year is bad"
        Exit Sub
    End If

    If dd = o Or dd > 31 Then
        MsgBox "day is bad"
        Exit Sub
    End If

    If mm = 0 Or mm > 12 Then
        MsgBox "month is bad"
        Exit Sub
    End If

    d = DateSerial(yr, mm, dd)
    MsgBox s & vbCrLf & d
End Sub

Вы также можете выполнять другие проверки, например, смотреть на длину поля и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...