Вы можете использовать эту простую функцию, чтобы проверить, является датой
Function checkFormatDate(str As String) As Boolean
Dim Y
Dim M
Dim D
Dim H
Dim I
Dim S
Dim theDate As Date
M = Mid(str, 1, 2)
D = Mid(str, 4, 2)
Y = Mid(str, 7, 4)
H = Mid(str, 12, 2)
I = Mid(str, 15, 2)
S = Mid(str, 18, 2)
theDate = DateSerial(Y, M, D) + TimeSerial(H, I, S)
If IsDate(theDate) Then
checkFormatDate = True
Else
checkFormatDate = False
End If
End Function
Это возвращает TRUE
(если дата) или FALSE
(если нет)
Просто заботится о датах, как: 02.05.2016.01.10.05
(где mm.dd.yyyy.hh.mm.ss
), потому что вам нужно верить, что 02
- это месяц, а не день, так как 05
- это день, а не месяц, всегда появляется кто-то с отличной идеей и меняет значения только потому, что.
Edit # 2
Heres лучший вариант кода:
Tester:
Sub testDate()
Dim Check As Boolean
Check = checkFormatDate2(UserForm1.TextBox1.Text)
'the textbox is inside UserForm1
If Check Then
MsgBox "Is a Date"
Else
MsgBox "Not a Date"
End If
End Sub
Функция:
Function checkFormatDate2(str As String) As Boolean
Dim ArrayD
Dim i
Dim m
ArrayD = Split(str, ".")
If UBound(ArrayD) <> 5 Then
checkFormatDate2 = False
Exit Function
End If
For i = 0 To 5
Select Case i
Case 0
If CInt(ArrayD(i)) < 1 Or CInt(ArrayD(i)) > 12 Then
checkFormatDate2 = False
Exit Function
End If
Case 1
If CInt(ArrayD(i + 1)) < 1900 Or CInt(ArrayD(i + 1)) > 2050 Then
'set the botton and limit year as you need
checkFormatDate2 = False
Exit Function
End If
Case 2
m = Day(DateSerial(CInt(ArrayD(2)), CInt(ArrayD(0)) + 1, 1) - 1)
'm = the last (num) day of the month
If CInt(ArrayD(i - 1)) < 1 Or CInt(ArrayD(i - 1)) > m Then
checkFormatDate2 = False
Exit Function
End If
Case 3
If CInt(ArrayD(i)) < 1 Or CInt(ArrayD(i)) > 23 Then
checkFormatDate2 = False
Exit Function
End If
Case 4
If CInt(ArrayD(i)) < 1 Or CInt(ArrayD(i)) > 59 Then
checkFormatDate2 = False
Exit Function
End If
Case 5
If CInt(ArrayD(i)) < 1 Or CInt(ArrayD(i)) > 59 Then
checkFormatDate2 = False
Exit Function
End If
Case Else
End Select
Next i
checkFormatDate2 = True
End Function
Используйте эту функцию, чтобы, если проверить текст внутри TextBox - это отправка даты TextBox.Value
или TextBox.Text
. Спасибо MikeD за ваш совет. Этот путь лучше.
Edit # 3
Как вы скажите мне в комментариях вы можете использовать AfterUpdate
на Textbox
, как это:
Private Sub TextBox1_AfterUpdate()
Dim a As Boolean
a = checkFormatDate2(Me.TextBox1.Value)
If a Then
MsgBox "is date"
Else
MsgBox "no date"
End If
End Sub
Где UserForm1
имеет TextBox
именем TextBox1
внутри, так и функция checkFormatDate2
находится в регулярном модуле. В моем случае я просто отправлю сообщение MsgBox
о том, что это не дата.
Редактировать # 4
Таким же образом можно проверить текст внутри TextBox, когда Выход из UserForm таким образом:
1) Добавьте кнопку и установите Cancel
свойства в TRUE
:
2) И внутри кода вы положили это:
Private Sub CommandButton1_Click()
Dim a As Boolean
a = checkFormatDate2(Me.TextBox1.Value)
If a Then
MsgBox "is date"
Else
MsgBox "no date"
End If
End Sub
Таким образом, при нажатии ESC
на клавиатуре или нажмите кнопку CommandButton1
вы пытаетесь закрыть UserForm и огонь кода, и проверить текст внутри TextBox
и вы можете делать все, что вы хотите, как и дон Не позволяйте пользователю уйти, вернитесь в TextBox после сообщения о правильном формате, ну, что хотите.
просто будьте осторожны, в TextBox у вас нет контроля над тем, что вводит пользователь; только один пробел спереди может дать совершенно неожиданный результат вашим функциям 'Mid()' и портить ваш 'DateSerial()' дальше. – MikeD
Эй @ MikeD Я отведу вас. Благодарю. –
@ ElbertVillarreal Спасибо за код, я пытаюсь его, но не могу назвать функцию на выходе из текстового окна. Я получаю сообщение об ошибке «Аргумент не является обязательным» – Noob2Java