Страницы: 1
RSS
Проверка ввода числовых значений в TextBox
 
Проверка на ввод числовых значений:  
 
Private Sub tBoxK_Exit(ByVal Cancel As MSForms.ReturnBoolean)  
   If Me.tBoxK.Text = "" Then Exit Sub  
   If IsNumeric(Me.tBoxK.Text) Then  
       Me.tBoxK = Format(Me.tBoxK, "#,##0.00")  
       Else  
       MsgBox "Попытка ввода нечисловых данных! Введите число"  
       Me.tBoxK.Text = ""  
'       Me.tBoxK.SetFocus  
   End If  
End Sub  
 
Таких элементов больше 10 и отслеживать каждый раз, где вводились данные, пользователю будет неудобно.  
Как оставить курсор в этом же TextBox?
 
Вить, не нужно MsgBox - просто не давай пользователю этой возможности.
 
Я бы посоветовал не выводить MSGBOX, и просто исключить возможность ввода в поле чего-либо, кроме цифр.  
Соответственно, и курсор из поля ввода никуда исчезать не будет.  
 
Пример можно поглядеть здесь:  
http://excelvba.ru/programmes/Fill_Invoice  
 
В некоторых случаях я подсвечивал текстбоксы с неверными данными красным цветом, попутно блокируя (.enable = false) кнопку ввода данных (пока пользователь не исправит ошибочные значения)  
 
Можно также использовать модуль класса - но код сложнее получится, проще скопипастить 10 макросов.  
 
Чем SetFocus не устроил?
 
Вить, для этих целей пользуюсь вот таким способом Игоря:  
Контроль ввода в TextBox  только цифры (Автор – EducatedFool)  
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)  
   txt = Me.TextBox1    ' читаем текст из поля (для недопущения ввода двух и более запятых)  
   If InStr(1, txt, ",") > 0 And Len(txt) - InStr(1, txt, ",") = 2 Then KeyAscii = 0  ' только 2 цифры после запятой  
   Select Case KeyAscii  
       Case 8:    ' нажат Backspace - ничего не делаем  
       Case 44: KeyAscii = IIf(InStr(1, txt, ",") > 0, 0, 44)    ' если запятая уже есть - отменяем ввод символа  
       Case 46: KeyAscii = IIf(InStr(1, txt, ",") > 0, 0, 44)    ' заменяем при вводе точку на запятую  
       Case 48 To 57    ' если введена цифра  - ничего не делаем  
       Case Else: KeyAscii = 0    ' иначе отменяем ввод символа  
   End Select  
End Sub
 
{quote}{login=EducatedFool}{date=04.01.2012 02:50}{thema=}{post}Можно также использовать модуль класса - но код сложнее получится, проще скопипастить 10 макросов.  
Чем SetFocus не устроил?{/post}{/quote}  
1. Как-то задавался этим вопросом. Выбрал вариант код_на_каждый_элемент-быстрее_обработка.    
2. SetFocus не срабатывает. Понял так, что после завершения процедуры ...__Exit() фокус автоматом перепрыгивает в следующий по Tab элемент.  
 
Другие предложения позже проверю-поэкспериментирую. Убегаю.
 
Тема приобрела другое направление. Прошу переименовать:  
"Проверка ввода числовых значений в TextBox"  
 
Спасибо за предложенные варианты.  
В показанном коде:  
- не понял, зачем отключать Backspace – наоборот, удобно, если неправильный ввод;  
- при вводе двух знаков после запятой нельзя ввести новое значение, выделив введенное. Т.е. вводили-вводили, написали "...,00", решили ввести по новой - ан нет, не пустит, пока не удалишь написанное. Так же не дает добавить пропущенное число: надо 235,22, ввели 25,22 - все, кончилось введение.    
 
Еще неудобство в данном случае - все равно без процедуры ..._Exit() не обойтись - нужно форматировать введенное число Format(..., "#,##0.00").  
 
Так как форматирование необходимо (визуально приятнее видеть число с разделением разрядов), можно использовать код Игоря, отключив проверку на "...,00" - после ввода любого числа символов после запятой при выходе из TextBox или Frame (здесь TextBox) форматирование оставит только два знака. Но в таком случае используется дополнительная процедура …_KeyPress.  
 
Пока что мысль с грозным предупреждением через MsgBox не отбрасываю.
 
C полгода-год назад вплотную занимался этим вопросом. Пришел к выводу: По событию Exit нельзя выполнить SetFocus. Там происходит хитрое зацикливание, и ожидаемый результат не достигается. Создавал тему по этому вопросу...  
Для себя выяснил примерно следующее:  
После  
Else  
MsgBox "Попытка ввода нечисловых данных! Введите число"  
это запускается вновь  
Private Sub tBoxK_Exit(ByVal Cancel As MSForms.ReturnBoolean)  
и на строку  
' Me.tBoxK.SetFocus  
не попасть никогда!  
(По крайней мере мне не удалось)  
А вот использование    
Cancel    
эффект дает.
 
Я ещё в таких случаях вешаю проверку на финальную кнопку: перебираю циклом с проверкой нужные контролы, и передаю фокус на первый неправильный с выходом из процедуры. Можно при этом подсветить неправильную ЧАСТЬ текста в контроле.
 
Сделал аналогично, но сбрасываю ВСЕ контролы после ошибочного в "". (Или true/false).
 
Юра, в таком случае пользователь может вводить неправильные данные хоть во все поля, но обнаружится это только перед "финальным свистком". Это не есть хорошо.
 
И пусть вводит: надоест возвращаться каждый раз - начнёт вводить правильно.
 
Чтобы здесь не обсуждать двух вопросов (а они разные), прошу здесь отписываться только по "числовой" теме. Для "курсорной" новая тема.
 
Всем - привет!  
Вот здесь еще было про текстбокс для чисел:  
http://www.planetaexcel.ru/forum.php?thread_id=7712  
Виктор, если нужно оформить это в виде класса - только свистните :-)
 
Нет, классы не нужны пока, код на каждый элемент устраивает.
Страницы: 1
Читают тему
Наверх