2016-03-02 2 views
0

Как я могу проверить конкретный формат в текстовом поле? Я сканируя метку в текстовом поле, которое содержит дату, которая отформатирована как:Excel VBA проверить конкретное форматирование в текстовом поле

mm.dd.yyyy.hh.mm.ss 

я попытался вещи, которые не работают ...

If Not Format(TextBox1, "mm.dd.yyyy.hh.mm.ss") Then 
MsgBox "Wrong Format" 
End If 

ответ

0

Вы можете использовать эту простую функцию, чтобы проверить, является датой

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:

enter image description here

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 после сообщения о правильном формате, ну, что хотите.

+0

просто будьте осторожны, в TextBox у вас нет контроля над тем, что вводит пользователь; только один пробел спереди может дать совершенно неожиданный результат вашим функциям 'Mid()' и портить ваш 'DateSerial()' дальше. – MikeD

+0

Эй @ MikeD Я отведу вас. Благодарю. –

+0

@ ElbertVillarreal Спасибо за код, я пытаюсь его, но не могу назвать функцию на выходе из текстового окна. Я получаю сообщение об ошибке «Аргумент не является обязательным» – Noob2Java

0

Try: Если TextBox1 = Format (TextBox1, "mm.dd.yyyy.hh.mm.ss") Затем

+0

Вы пробовали это? Поскольку TextBox1 не содержит даты, форматирование даты приведет к ошибке переполнения – MikeD

+0

Вы верны. Я не думал, что через – Slubee

+0

Спасибо всем за вашу помощь и предложения. Я планирую протестировать и попробовать все из них, чтобы лучше понять, как это работает. – Noob2Java

0

TextBox1 не содержит формат даты, поэтому вы не можете применять функцию Format() с использованием кодов формата даты и времени.

Одним из решений было бы разделить вашу строку на элементы массива и изучить их по одному, например.

Sub Test() 
Dim A() As String, Rslt As Boolean 

A = Split(Me.TextBox1.Value, ".") ' load dot seperated elements into array 

If UBound(A) <> 5 Then 
    MsgBox "not 6 numbers seperated by (5) dots" 
    Rslt = False 

ElseIf Val(A(0)) < 1 Or Val(A(0)) > 12 Then 
    MsgBox "1st part not a valid month (01-12)" 
    Rslt = False 

ElseIf Val(A(1)) < 1 Or Val(A(1)) > 31 Then 
    MsgBox "2nd part not a valid day (01-31)" 
    Rslt = False 

ElseIf Val(A(2)) < 0 Or Val(A(1)) > 99 Then 
    MsgBox "3rd part not a valid year (00-99)" 
    Rslt = False 

ElseIf Val(A(3)) < 0 Or Val(A(3)) > 23 Then 
    MsgBox "4th part not a valid hour (00-23)" 
    Rslt = False 

ElseIf Val(A(4)) < 0 Or Val(A(4)) > 59 Then 
    MsgBox "5th part not a valid minute (00-59)" 
    Rslt = False 

ElseIf Val(A(5)) < 0 Or Val(A(5)) > 59 Then 
    MsgBox "6th part not a valid second (00-59)" 
    Rslt = False 
End If 

If Not Rslt Then 
    'beat the user 
End If 
End Sub 

Это не рассматривает месяцев с 28/29/30/31 дней, но это только 1 или 2, если это дальше.

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