I have simple textBox and I want to validate its input including «+» , «-» and «.» here is what I have tried
Private Sub DisplayValue_TextBox_Change()
If Not IsNumeric(DisplayValue_TextBox.Value) Then
MsgBox "Only numbers allowed"
End If
End Sub
But this only accepts numbers 0-9 no negative, positive value or float value..
asked Oct 1, 2014 at 10:03
2
Further to my comment:
Consider a sample Userform1 with a Textbox1 and a CommandButton1
when you enter anything in the TextBox1
the change event fires — ie. typing one character fires the Change()
event and passes the current value so even when you type in the negative sign your current logic fails.
What you need is to use another event like _AfterUpdate()
or _Exit()
with an amphasis on the second one because your can cancel the event
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox1.Value) Then
MsgBox "only numbers allowed"
Cancel = True
End If
End Sub
You can find events here:
answered Oct 1, 2014 at 10:26
0
use the KeyPress event, and discard any non-numeric entry:
Private Sub txtShift1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Debug.Print KeyAscii
If KeyAscii >= 48 And KeyAscii <= 57 Then
Debug.Print "number"
Else
Debug.Print "other"
KeyAscii = 0
End If
End Sub
answered Jan 20, 2017 at 19:02
Having relied up till now on string parsing to do this job, I’m glad I decided to check and see how other people do it and found this Q.
I’ve refined Ruben Alvarez’s excellent answer. The below will allow numerical entries only, and only one decimal point.
Private Sub txtShift1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 46
If InStr(1, txtShift1, ".") > 0 Then KeyAscii = 0
Case 48 To 57
Case Else
KeyAscii = 0
End Select
End Sub
This could be further refined to allow only a single «+», «-» etc. as necessary.
answered Jun 5, 2017 at 10:09
blackworxblackworx
5175 silver badges19 bronze badges
I use this. It will allow only numbers with decimals.
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case vbKey0 To vbKey9, vbKeyBack, vbKeyClear, vbKeyDelete, _
vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
If KeyAscii = 46 Then If InStr(1, TextBox1.Text, ".") Then KeyAscii = 0
Case Else
KeyAscii = 0
Beep
End Select
End Sub
answered Aug 3, 2019 at 11:11
Siddharth RoutSiddharth Rout
146k17 gold badges206 silver badges250 bronze badges
2
Im using that:
Private Sub txtGiaNet_Change()
If IsNumeric(txtGiaNet.Value) Then
//if number do sth
Else
//if not, delete this character
txtGiaNet.Value = Left(txtGiaNet.Value, Len(txtGiaNet.Value) - 1)
End If
End Sub
clemens
16.4k11 gold badges48 silver badges65 bronze badges
answered Dec 17, 2017 at 11:01
1
If TextBox1.Value <> "" Then
Dim N As Boolean
N = True
Do While N
If Not IsNumeric(TextBox1.Value) Then
TextBox1.Value = Left(TextBox1.Value, Len(TextBox1.Value) - 1)
Else
N = False
End If
Loop
End If
Taazar
1,54518 silver badges27 bronze badges
answered Sep 15, 2020 at 3:06
Private Sub TbCout_D_Edlp_Change()
Dim NotNumeric As Boolean
Dim TempValue As String
If Not IsNumeric(TbCout_D_Edlp.Value) Then
If TbCout_D_Edlp.Value <> "" Then
NotNumeric = True
MsgBox "Only numbers allowed"
TempValue = Left(Me.TbCout_D_Edlp.Value, Len(Me.TbCout_D_Edlp.Value) - 1)
While NotNumeric = True And TempValue <> ""
If Not IsNumeric(TempValue) Then
TempValue = Left(TempValue, Len(TempValue) - 1)
Else
NotNumeric = False
End If
Wend
Me.TbCout_D_Edlp.Value = TempValue
End If
End If
End Sub
answered Nov 20, 2020 at 0:32
1
FWIW, I was fine with the OPs limitations on the type of values accepted but wasn’t fine with the msgbox arriving at inappropriate times (such as when Backspace was used). To resolve that, I created a calculated field in the worksheet («Value_AnyGood») that used the ISNUMBER function on the entered data. I then tested that for «True» on any event that left the UF where the data was entered. That resulted in a process that caught any non-numeric entries but didn’t pop up a message for legitimate editing efforts. If the value was False, it lets the user know and then ends the routine with the current UF displayed.
answered Mar 7 at 9:56
1
Kirill Gureev Пользователь Сообщений: 653 |
#1 07.08.2018 22:31:03 Уважаемые коллеги.
Объясните мне, пожалуйста, что такое свойство Tag и что тут вообще происходит в условии? P.S. Было бы здорово, если бы Вы подсказали как ещё добавить разрешение на ввод десятичного знака. Изменено: Kirill Gureev — 07.08.2018 22:31:50 |
||
Karataev Пользователь Сообщений: 2306 |
#2 07.08.2018 22:39:19 Я предлагаю Вам использовать этот код, я думаю, что его достаточно для Вашей задачи. Десятичный разделитель запятая (код 44).
Изменено: Karataev — 08.08.2018 07:44:12 |
||
Logistic Пользователь Сообщений: 741 |
Как вариант Прикрепленные файлы
|
Karataev, очень странно, что Вы говорите, что этот код не надо использовать. Результат он даёт… почему бы и нет. Взят он также в какого-то форума с этим же вопросом… но вот что делает условие — не понятно. Также, если уж не совсем я обнаглел, как запретить больше одного ввода запятой? Изменено: Kirill Gureev — 07.08.2018 22:53:14 |
|
Karataev Пользователь Сообщений: 2306 |
Мне Ваш код кажется сложным для понимания, поэтому я Вам советую использовать мой код. Изменено: Karataev — 08.08.2018 07:45:02 |
Logistic, спасибо. Очень понятно. |
|
Karataev Пользователь Сообщений: 2306 |
#7 07.08.2018 22:59:24
|
||
Karataev, сударь, не сводите меня с ума! |
|
Karataev Пользователь Сообщений: 2306 |
Да, путаница возникла с именами текстобоксом. У меня TextBox1, в Вашем посте 1 TextBox3. У меня Ваш код просто не запускался. |
Kirill Gureev Пользователь Сообщений: 653 |
#10 07.08.2018 23:06:41 Karataev, согласен)
|
||
Karataev Пользователь Сообщений: 2306 |
#11 07.08.2018 23:11:53 Смысл Вашего кода такой. В тег запоминается число, которое было ранее записано в TextBox. Если в TextBox’е появляется нечисло, то в TextBox записываются данные из тега, т.е. число, которое было ранее, до ввода неправильного символа.
Изменено: Karataev — 08.08.2018 07:48:42 |
||
Юрий М Модератор Сообщений: 60574 Контакты см. в профиле |
#12 07.08.2018 23:27:36 Я пользуюсь этим:
|
||
Василий Морозов Пользователь Сообщений: 13 |
#14 08.02.2023 16:04:20 Добрый день!
Обнаружилось, что в ТекстБокс1 вводится все верно, но на выходе 4 знака после запятой. Чтоб получить 5 знаков нужно нажать дополнительно любую (это не точно, пробовал цифры на NumPad) кнопку.
Изменено: Morozka — 10.02.2023 20:13:37 |
||||
SlA_pls Пользователь Сообщений: 8 |
#15 21.02.2023 13:43:34 Всем привет!
|
||
Artem1977 Пользователь Сообщений: 163 |
SlA_pls, почитайте пожалуйста здесь Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit |
MikeVol Пользователь Сообщений: 229 Ученик |
SlA_pls, Доброго времени суток. Вы выложили только кусок кода где вы добавляете динамически TextBox. А весь код где вы присваеваете к этому TextBox-у или TextBox-ам событие типа Change или Exit? Может там проблема? |
SlA_pls Пользователь Сообщений: 8 |
#18 22.02.2023 11:55:39
Спасибо большое! |
||
Fedor_sumkin 0 / 0 / 0 Регистрация: 29.03.2015 Сообщений: 4 |
||||
1 |
||||
02.04.2015, 14:08. Показов 18714. Ответов 4 Метки нет (Все метки)
у меня есть код ввода только цифр, при вводе буквы выходит ошибка, как сделать, чтобы выходило окно…к примеру, «Буквы нельзя!!» ??
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
02.04.2015, 17:08 |
2 |
|||
Непонятно, где тут «выходит ошибка», «переход к коду». При вводе буквы она просто игнорируется.
0 |
Vovchikvsb 466 / 123 / 61 Регистрация: 04.03.2015 Сообщений: 325 |
||||||||
02.04.2015, 18:38 |
3 |
|||||||
Сообщение было отмечено Fedor_sumkin как решение РешениеЕсли хотите запретить введение всего, кроме цифр, можно применить такой способ.
Добавлено через 1 час 19 минут
2 |
Fedor_sumkin 0 / 0 / 0 Регистрация: 29.03.2015 Сообщений: 4 |
||||
03.04.2015, 14:47 [ТС] |
4 |
|||
Спасибо большое всё работает. Я переделал твой код, так чтобы вводились только буквы, и у меня возникла проблема, вводятся лишь заглавные буквы или прописные, можно ли как-нибудь это исправить?
t
0 |
Vovchikvsb 466 / 123 / 61 Регистрация: 04.03.2015 Сообщений: 325 |
||||
03.04.2015, 15:43 |
5 |
|||
Можно сравнивать так
0 |
-
#2
Try putting the code below (from Ozgrid) in the Userforms module.
Code:
Private Sub TextBox1_Change()
If TypeName(Me.ActiveControl) = "TextBox" Then
With Me.ActiveControl
If Not IsNumeric(.Value) And .Value <> vbNullString Then
MsgBox "Sorry, only numbers allowed"
.Value = vbNullString
End If
End With
End If
End Sub
-
#3
Try putting the code below (from Ozgrid) in the Userforms module.
Code:
Private Sub TextBox1_Change() If TypeName(Me.ActiveControl) = "TextBox" Then With Me.ActiveControl If Not IsNumeric(.Value) And .Value <> vbNullString Then MsgBox "Sorry, only numbers allowed" .Value = vbNullString End If End With End If End Sub
The problem with a Change event only procedure is that it will not prevent a user from pasting in bad data. In addition, I do not like the idea of popping that MessageBox up with every mistype. The following coordinated event code procedures (and one global event variable) will allow only proper numeric values in the TextBox whether typed or pasted in. Note the two colored lines of code… the OP did not describe what he meant by «numeric input… digits only or floating point numbers, so I provided code for either. Uncomment the red line of code for digits only OR uncomment the blue line of code for floating point numbers (only uncommen one of the lines of code and leave the other commented out).
Code:
Dim LastPosition As Long
Private Sub TextBox1_Change()
Static LastText As String
Static SecondTime As Boolean
If Not SecondTime Then
With TextBox1
' Digits Only
'If .Text Like "*[!0-9]*" Then
' Floating Point Numbers
If .Text Like "*[!0-9.]*" Or .Text Like "*.*.*" Then
Beep
SecondTime = True
.Text = LastText
.SelStart = LastPosition
Else
LastText = .Text
End If
End With
End If
SecondTime = False
End Sub
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
With TextBox1
LastPosition = .SelStart
'Place any other MouseDown event code here
End With
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
With TextBox1
LastPosition = .SelStart
'Place any other KeyPress checking code here
End With
End Sub
Last edited: Dec 25, 2013
ZVI
MrExcel MVP
-
#4
This code allows typing of digits & dot symbol and block others:
Rich (BB code):
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 59
' Allow digits - do nothing
Case 46
' Allow only one dot symbol
If InStr(ActiveControl, ".") Then KeyAscii = 0
Case Else
' Block others
KeyAscii = 0
End Select
End Sub
Note: Pasting from another control is not controlled
Last edited: Dec 25, 2013
-
#5
This code allows typing of digits & dot symbol and block others:
Rich (BB code):
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 48 To 59 ' Allow digits - do nothing Case 46 ' Allow only one dot symbol If InStr(ActiveControl, ".") Then KeyAscii = 0 Case Else ' Block others KeyAscii = 0 End Select End Sub
As I pointed out to MARK858 for the code he posted, your code also allows the user to paste in bad data. See the code I posted in Message #3 for a method that gets around that problem.
ZVI
MrExcel MVP
-
#6
Thanks Rick! I’ve added the note to my code.
To solve the pasting issue you can use this additional code:
Rich (BB code):
Private Sub TextBox1_Enter()
With New DataObject
.GetFromClipboard
.SetText Trim(Str(Val(.GetText)))
.PutInClipboard
End With
End Sub
Trim(Str(… )) gives independence from local decimal separator like comma
Last edited: Dec 25, 2013
-
#7
To solve the pasting issue you can use this additional code:
Code:
Private Sub TextBox1_Enter() With New DataObject .GetFromClipboard .SetText Trim(Str(Val(.GetText))) .PutInClipboard End With End Sub
I see two problems with that solution. First, on my XL2010 workbook…. true, using that code stops CTRL+V from being able to paste bad data that was previously copied into the clipboard buffer, but two blank spaces get placed into the TextBox instead. Second, and more importantly, because the code is located in the Enter event, it will not stop a user from bringing up the UserForm, then switching to a different window and copying bad data into the Clipboard buffer, then returning to the TextBox and pasting it in at that point. True, that is not something one would expect a user to do, but more than likely, any subsequent code would either crash or output bad results if the user did. I’m still pushing for my solution in Message #3… it should be completely foolproof (it was developed and debugged many, many years ago for use in the compiled version of VB and later adapted to the minor differences between the old VB’s Forms and Excel’s VBA UserForms).
ZVI
MrExcel MVP
-
#8
Nice code Rick, thanks for sharing!
BTW, supporting of negative numbers would be useful too
Regards,
Vlad
-
#9
Nice code Rick, thanks for sharing!
You are quite welcome… I am glad you liked it.
BTW, supporting of negative numbers would be useful too
No problem… that is one of the nice things about the structure of my code, it is easy to modify for different conditions. Here is the code with two new color sections added to allow the digits only (purple) and the floating point numbers (green) to have a leading plus or minus sign (as before, uncomment the one you want and make sure the others are commented out)…
Rich (BB code):
Dim LastPosition As Long
Private Sub TextBox1_Change()
Static LastText As String
Static SecondTime As Boolean
If Not SecondTime Then
With TextBox1
' Digits Only (no plus or minus)
'If .Text Like "*[!0-9]*" Then
' Digits Only (plus or minus allowed)
'If .Text Like "*[!0-9+-]*" Or .Text Like "?*[+-]*" Then
' Floating Point Numbers (no plus or minus)
'If .Text Like "*[!0-9.]*" Or .Text Like "*.*.*" Then
' Floating Point Numbers (plus or minus allowed)
If .Text Like "*[!0-9.+-]*" Or .Text Like "?*[+-]*" Or .Text Like "*.*.*" Then
Beep
SecondTime = True
.Text = LastText
.SelStart = LastPosition
Else
LastText = .Text
End If
End With
End If
SecondTime = False
End Sub
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
With TextBox1
LastPosition = .SelStart
'Place any other MouseDown event code here
End With
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
With TextBox1
LastPosition = .SelStart
'Place any other KeyPress checking code here
End With
End Sub
-
#10
Rick, that is a neat and comprehensive bit of code. Filed away for future reference.
Have a great Christmas
Как разрешить ввод только чисел в текстовое поле?
В Excel мы можем применить функцию проверки данных, чтобы в ячейки можно было вводить только числа, но иногда я хочу, чтобы в текстовое поле, а также в ячейки вводились только числа. Как принимать только числа в текстовом поле в Excel?
Разделите диапазон ячеек на число с помощью специальной функции «Вставить»
Разделите диапазон ячеек на число с помощью специальной функции «Вставить»
Следующий код VBA может помочь вам вводить числа, точку (.) И отрицательный знак только в текстовое поле, пожалуйста, сделайте следующее:
1. Создайте текстовое поле, нажав Застройщик > Вставить > Текстовое поле (элемент управления ActiveX), а затем нарисуйте текстовое поле, как вам нужно, см. снимок экрана:
2. Затем щелкните текстовое поле правой кнопкой мыши и выберите Просмотреть код из контекстного меню, чтобы открыть Microsoft Visual Basic для приложений окна, а затем замените исходный код следующим кодом VBA в пустой модуль:
Код VBA: разрешить ввод только чисел в текстовое поле:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii > Asc("9") Or KeyAscii < Asc("0") Then
If KeyAscii = Asc("-") Then
If InStr(1, Me.TextBox1.Text, "-") > 0 Or _
Me.TextBox1.SelStart > 0 Then KeyAscii = 0
ElseIf KeyAscii = Asc(".") Then
If InStr(1, Me.TextBox1.Text, ".") > 0 Then KeyAscii = 0
Else
KeyAscii = 0
End If
End If
End Sub
3. Затем сохраните и закройте окно кода и выйдите из Режим проектирования, теперь в текстовое поле можно вводить только числа, символ точки и знак минуса, см. снимок экрана:
Статьи по теме:
Как применить проверку орфографии в текстовом поле?
Как изменить цвет текстового поля в зависимости от значения в Excel?
Как вставить картинку в текстовое поле?
Как установить значение по умолчанию в текстовом поле?
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Комментарии (3)
Оценок пока нет. Оцените первым!