2016-06-01 6 views
0

Кто-нибудь знает, как подтвердить формат даты в формате mm/dd/yyyy. Я пробовал этот код, но не работает.Дата подтверждения формата

В UserForm:

dateCheck (txtStartDate) 

В модуле:

Function dateCheck(dateValue As Date) As Boolean 
    If CDate(dateValue) <> "mm/dd/yyyy" Then 
     MsgBox "Please use the mm/dd/yyyy date format!" 
     dateCheck = True 
    End If 
End Function 

я на правильном пути? Благодаря!

+0

Знаете ли вы о [функции VBA] (https://msdn.microsoft.com/en-us/library/office/gg278584%28v=office.15%29.aspx) 'IsDate'? – Ralph

+0

Да, я знаю об этом. – kruk22

+0

пользователь может ввести 05/01/2016, который он имел в виду 5 января 2016 года, но ваша пользовательская форма будет интерпретироваться как 1 мая 2016 года. Избегайте всех аномалий, позволяйте вводить пользователя в любом формате, который им нравится, но всегда меняете введенную дату в формате «dd-mmm-yyyy». Excel может распознать локализованный формат и соответствующим образом изменить их в ваш предпочтительный формат. – Rosetta

ответ

1

Часть вашей функции просто вернет 'dateValue' как Date. Используйте .Numberformat свойство для получения формата:

Function dateCheck(dateValue As Date) As Boolean 
    If dateValue.NumberFormat <> "mm/dd/yyyy" Then 
     MsgBox "Please use the mm/dd/yyyy date format!" 
     dateCheck = True 
    End If 
End Function 
+0

ОП упомянул использование формы. Вы уверены, что доступен доступ к '.NumberFormat', на котором когда-либо контролируется OP в его/ее форме? – Ralph

+0

Я уже пробовал это. В нем говорится: Недействительный отбор. – kruk22

0

Проблема заключается в том, что ваш вопрос усугубляется. На ваш вопрос на самом деле два этапа:

  1. Действительно ли txtStartDate действительно действительная дата?
  2. Если это дата, правильно ли она отформатирована?

Именование txtStartDate означает, что вы получаете дату в виде текста (в форме). Тем не менее, вы передаете его своей функции с предположением, что txtStartDate на самом деле является датой. Это становится очевидным, потому что функция dateCheck ожидает дату: Function dateCheck(dateValue As Date) As Boolean.

Итак, вот предложение решение, чтобы решить оба сразу:

Sub tmpTest() 

Dim txtStartDate As String 

txtStartDate = "11/20/2015" 

Debug.Print dateCheck(txtStartDate) 

End Sub 

Function dateCheck(dateValue As String) As Boolean 

If IIf(IsDate(txtStartDate), Format(CDate(txtStartDate), "mm/dd/yyyy"), "") = dateValue Then dateCheck = True 

End Function 

Имейте в виду, что это очень упрощенный подход, который не будет работать для международных форматов даты. На самом деле, возможно, вам придется немного изменить его, поскольку у меня нет формата даты. Если вам нужно что-то более сложное, вам придется написать немного больше кода VBA (включая расширенную функцию проверки).

+0

Да, это работает, если пользователь вводит действительную дату. Но если нет, он возвращает ошибку. Можем ли мы просто попытаться использовать On error Resume Next Statement для обработки ошибки? Но я не знаю, как это понимать. Это просто моя идея. – kruk22

+0

Функция должна всегда возвращать 'True' или' False', а не ошибку. По крайней мере, это то, что я здесь получаю. Тем не менее, я знаю, что вышеупомянутое является очень упрощенным (как упоминалось ранее) подходом и не охватывает многие случаи. Создание сложной функции проверки даты, включая множество разных форматов дат и других удобств (например, следующие даты «05/19' автоматически завершаются до' 05/19/2016' и '-7', автоматически возвращаются к дате один неделю назад) потребует намного больше VBA-кодирования. – Ralph

+0

Чтобы сделать его более совместимым на международном уровне, вы можете использовать '' mm \/dd \/yyyy '' вместо '" mm/dd/yyyy "' в качестве аргумента для 'Format'. Затем он заставляет '/' s. В моей системе 'Format' заменяет'/'на' .', если я использую '' mm/dd/yyyy'' (что плохо делать imo). – arcadeprecinct

0
Function dateCheck(dateStrng As String) As Boolean 
Dim dateArr as Variant 

If IsDate(dateStrng) Then ' <~~ if it IS a date 
    dateArr = Split(dateStrng,"/") 
    If UBound(dateArr) = 2 Then '<~~ if it has three substrings separate by two "slashes" 
     If CInt(dateArr(0)) < 13 Then '<~~ if the 1st number is lower or equals the maximum possible month number 
     If CInt(dateArr(0)) > 0 Then '<~~ if the 1st number is higher or equals the mimimum possible month number 
      If CInt(dateArr(1)) < 31 Then '<~~ if the 2nd number is lower or equals the maximum possible day number 
       If CInt(dateArr(1)) > 0 Then '<~~ if the 2nd number is higher or equals the mimimum possible day number 
        If CInt(dateArr(2)) < 10000 Then dateCheck = CInt(dateArr(2)) > 999 '<~~ if the 3rd number is a 4 digit integer "year" number, then check returns True 
       End If 
      End If 
     End If 
     End If 
    End If 
End Function 
+0

@ kruk22: Вы попробовали это? – user3598756

+0

@ kruk22: вам было бы приятно дать отзыв о попытках помочь вам – user3598756

0

Функция dateCheck не соответствует указанным в вопросе. Проблема с этой функцией не будет правильно идентифицировать 1/12/2017 или 12/1/2017.

dateCheck работает как isDate().

-2

Функция dateCheck неправильная с вопроса, заданного по этой теме. Проблема с этой функцией не будет правильно идентифицировать 1/12/2017 или 12/1/2017.

Смежные вопросы