2014-03-17 8 views
0

У меня есть текстовое поле в пользовательской форме, которое будет заполняться цифрами, запятыми или точками. Я знаю, как ограничить использование только этих символов. Мой вопрос заключается в возможности ограничить значение заполнения до 2 цифр после комы/точки?Ограничить количество цифр после запятой в текстовом поле

Так что, когда я ввожу значение как: 1023,456, он не дал мне ввести 6 без каких-либо действий.

Отредактировано:
Я не могу получить это ... Я пробовал здесь коды тестирования: Regex to match 2 digits, optional decimal, two digits Однако он соответствует слишком многим вещам. Когда я набираю более двух цифр после запятой, он по-прежнему совпадает с хорошей строкой. Я, например:

\d{0,2}(\,\d{1,2})?
[0-9]?[0-9]?(\,[0-9][0-9]?)?

Что я делаю неправильно?

Private Sub netto_Change() 

Dim regEx As New VBScript_RegExp_55.RegExp 

regEx.Pattern = "\d{0,2}(\,\d{1,2})?" 

If regEx.Test(netto.Value) = True Then MsgBox ("It works!") 

End Sub 

Edit 2:
Хорошо, я действительно близко, что я получил этот код: ^[0-9]+[\,\.]?[0-9]?[0-9]$ но одна вещь отсутствует. Этот шаблон также должен применяться к строке типа: 321, с запятой \ точка в конце, но ничего не после этого.

Что делать?

+0

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

+0

Обозначает ли запятая разделитель тысяч или десятичную точку или ни в приложении? – rajah9

+0

@ rajah9 Это десятичная точка. Таким образом, это случай, когда вы не добавляете больше цифр, чем это возможно - особенно случайно. – lowak

ответ

0

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

Прежде всего я использовал событие KeyPress, чтобы предотвратить ввод любых символов, отличных от 0-9, запятой и точкой. Чтобы мой код работал так, как я хотел, я добавил код к событию Change. If sentence проверяет, есть ли запятая или точка в моем входе texbox. Если это так, ограничивает максимальную длину.

Private Sub netto_Change() 

Dim znaki As Byte 

znaki = Len(netto.Value) 


If InStr(1, netto.Value, ".", vbTextCompare) > 0 Or InStr(1, netto.Value, ",", vbTextCompare) > 0 Then 

    If netto.MaxLength = znaki + 1 Or netto.MaxLength = znaki Then 

    Else 
    netto.MaxLength = znaki + 2 

    End If 

Else 
netto.MaxLength = 0 

End If 

End Sub 

Private Sub netto_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 

Select Case KeyAscii 

    Case Asc("0") To Asc("9") 
    Case Asc(",") 
    Case Asc(".") 
    Case Else 
    KeyAscii = 0 

End Select 

End Sub 
0

Элементы управления Textbox (есть как минимум два: ActiveX и UserForm) имеют события, которые могут использоваться для QA данных.

На UserForm:

Private Sub TextBox1_Change() 
     ' QA text here 
    End Sub 

Есть другие события, как KeyDown() и Exit(), которые могут работать лучше.

+0

Действительно, я знаю события, но как заставить его работать? – lowak

+0

Возьмите на него удар и создайте новую цепочку с кодом. Укажите, какой текстовый ящик вы используете и где он находится: элемент управления на листе, UserForm. – rheitzman

0

Предполагается, что у вас есть код события для улавливания после пользователь заполняет запись в TextBox. Этот код должен вызывать следующую функцию. Функция вернет True, если строка хороша, False если строка плохая. Ваш код должен решить, как обращаться с Ложные:

Public Function QualCheck(S As String) As Boolean 
    Dim L As Long, CH As String, I As Long 
    QualCheck = False 
    L = Len(S) 
    For I = 1 To L 
     CH = Mid(S, I, 1) 
     If CH Like "[0-9]" Or CH = "." Or CH = "," Then 
     Else 
      MsgBox "bad character " & CH 
      Exit Function 
     End If 
    Next I 
    If InStr(S, ".") + InStr(S, ",") = 0 Then 
     QualCheck = True 
     Exit Function 
    End If 
    If InStr(S, ".") > 0 Then 
     ary = Split(S, ".") 
     If Len(ary(1)) > 2 Then 
      MsgBox "too many characters after ." 
     Else 
      QualCheck = True 
     End If 
     Exit Function 
    End If 
    If InStr(S, ",") > 0 Then 
     ary = Split(S, ",") 
     If Len(ary(1)) > 2 Then 
      MsgBox "too many characters after ," 
     Else 
      QualCheck = True 
     End If 
    End If 
End Function 

Примечание:

Этот код не зависит от REGEX

+0

Ну, на самом деле не 'after', а' on change'. Вот почему 3-я цифра после запятой/точкой не может быть введена или может быть введена, но должна быть немедленно удалена. – lowak

+0

Затем он должен быть встроен в событие ** KeyPress ** ..... Мне понадобится ** больше времени ** –

+0

Спасибо за ваши усилия! Если у вас есть идея, было бы здорово его протестировать. – lowak

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

  • Нет связанных вопросов^_^