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 |
||
Юрий М Модератор Сообщений: 60577 Контакты см. в профиле |
#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
Спасибо большое! |
||
Элемент управления пользовательской формы TextBox в VBA Excel. Использование текстового поля для ввода и вывода информации, основные свойства, примеры. Привязка текстового поля к ячейке.
UserForm.TextBox – это элемент управления пользовательской формы, предназначенный для ввода, редактирования и вывода информации в текстовом формате.
Текстовое поле незаменимо, когда необходимо заполнить пользовательскую форму новой информацией. Например, это может быть ФИО нового сотрудника и его паспортные данные, сумма выручки за день, новый электронный адрес и многое-многое другое.
Если с помощью текстового поля требуется вводить заранее известную информацию, элементы которой можно сгруппировать в список, то в этом случае удобнее вместо элемента управления TextBox использовать ListBox или ComboBox.
Вводить информацию в TextBox на открытой форме можно не только с помощью клавиатуры, но и вставкой текста из буфера обмена. Когда текстовое поле применяется для ввода пароля, есть возможность отобразить все его знаки замещающим символом, например, звездочкой.
Иногда, если на пользовательской форме используется только одно текстовое поле и кнопка «OK» (или кнопки «OK» и «Отмена»), для ввода информации такую форму можно заменить функцией InputBox, а для вывода информации, когда не требуется редактирование отображаемого текста, – функцией MsgBox.
Свойства текстового поля
Свойство | Описание |
---|---|
AutoSize* | Автоподбор размера текстового поля. True – размер автоматически подстраивается под длину размещаемой строки. False – размер элемента управления определяется свойствами Width и Height. |
AutoTab | Включение автоматической табуляции – передачи фокуса следующему элементу управления при достижении максимального числа символов при значениях свойства MaxLenght > 0. True – автоматическая табуляция включена, False – выключена. |
ControlSource | Ссылка на источник данных для поля TextBox. |
ControlTipText | Текст всплывающей подсказки при наведении курсора на TextBox. |
Enabled | Возможность ввода, редактирования, копирования, вставки, удаления текста. True – все перечисленные опции включены, False – выключены (цвет текста в поле становится серым). |
Font | Шрифт, начертание и размер текста в поле. |
Height | Высота текстового поля. |
Left | Расстояние от левого края внутренней границы пользовательской формы до левого края текстового поля. |
Locked | Запрет ввода, редактирования, удаления текста. True – перечисленные опции запрещены (разрешено выделение и копирование текста), False – перечисленные опции разрешены. |
MaxLenght | Максимальная длина строки. По умолчанию – 0, что означает – ограничений нет. |
Multiline | Устанавливает многострочный (True) или однострочный (False) режим ввода-вывода текста. |
PasswordChar | Задает символ, который будет отображаться при вводе знаков пароля. |
TabIndex | Определяет позицию элемента управления в очереди на получение фокуса при табуляции, вызываемой свойством AutoTab или нажатием клавиш «Tab», «Enter». Отсчет начинается с 0. |
Text** | Текстовое содержимое (значение) поля (=Value). |
TextAlign | Выравнивание текста: 1 (fmTextAlignLeft) – по левому краю, 2 (fmTextAlignCenter) – по центру, 3 (fmTextAlignRight) – по правому краю. |
Top | Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края текстового поля. |
Value** | Текстовое содержимое (значение) поля (=Text). |
Visible | Видимость текстового поля. True – TextBox отображается на пользовательской форме, False – TextBox скрыт. |
Width | Ширина текстового поля. |
WordWrap | Актуально при Multiline = True. Переход на новую строку при достижении границы текстового поля. True – переход включен, False – переход выключен. |
* При использовании свойства AutoSize в значении True следует учитывать, что автоматическое изменение размеров поля при вводе текста может нарушить дизайн пользовательской формы.
** Text и Value — это два обозначения одного и того же свойства. Если в окне Properties элемента управления TextBox в поле свойства Text начать ввод строки, в поле Value ввод будет дублироваться. И наоборот, при вводе текста в поле свойства Value, дублирование произойдет в поле Text.
В таблице перечислены только основные, часто используемые свойства текстового поля. Все доступные свойства отображены в окне Properties элемента управления TextBox.
Свойства BackColor, BackStyle, BorderColor, BorderStyle отвечают за внешнее оформление текстового поля и его границ. Попробуйте выбирать доступные значения этих свойств в окне Properties, наблюдая за изменениями внешнего вида элемента управления TextBox на проекте пользовательской формы.
Привязка текстового поля к ячейке
Привязать элемент управления TextBox к ячейке на рабочем листе можно двумя способами.
1. В окне Properties элемента управления TextBox в поле свойства ControlSource необходимо указать адрес ячейки:
2. Присвоить свойству ControlSource адрес ячейки в коде VBA Excel:
UserForm1.TextBox1.ControlSource = «C5» |
Теперь ячейка C5 активного листа будет привязана к элементу управления TextBox1. При открытии формы текстовое поле будет заполнено значением ячейки C5.
Чтобы наглядно ознакомиться с взаимозависимостью значения ячейки C5 и содержимого текстового поля, разместите на пользовательской форме еще какой-нибудь элемент управления и откройте ее в немодальном* окне:
Sub Test() UserForm1.TextBox1.ControlSource = «C5» UserForm1.Show 0 End Sub |
Измените значение ячейки C5 и нажмите клавишу «Tab» или «Enter» – изменения будут продублированы в текстовом поле на форме. Измените содержимое поля TextBox1, нажмите клавишу «Tab» или «Enter», передав фокус другому элементу управления, – изменения продублируются в ячейке C5.
Чтобы привязать текстовое поле к ячейке неактивного листа, необходимо в адресе указать имя листа по ярлыку с разделителем «!»:
UserForm1.TextBox1.ControlSource = «Лист2!A3» |
Если имя листа содержит пробел, заключите его в одинарные кавычки:
UserForm1.TextBox1.ControlSource = «‘Мой лист’!B6» |
Точно также адрес ячейки конкретного листа можно указать непосредственно в окне Properties элемента управления TextBox в поле свойства ControlSource (без парных кавычек).
* Отображение пользовательской формы в немодальном окне позволяет редактировать ячейки на рабочем листе Excel, не закрывая форму.
Примеры использования TextBox
Пример 1
Обмен содержимым между текстовым полем, переменной и ячейкой на рабочем листе:
‘Присвоение текстовому полю значения ‘ячейки A2 и переменной a1 UserForm1.TextBox1.Text = Range(«A2») UserForm1.TextBox1.Text = a1 ‘Присвоение ячейке B3 и переменной a2 ‘значения текстового поля Cells(3, 2) = UserForm1.TextBox1.Text a2 = UserForm1.TextBox1.Value ‘Свойства Text и Value элемента ‘управления TextBox равнозначны |
Пример 2
Программное создание элемента управления TextBox, размещение его по центру пользовательской формы, добавление всплывающей подсказки и текста по умолчанию.
Предположим, что текстовое поле предназначено для ввода даты, поэтому добавляем соответствующую подсказку, а в качестве текста по умолчанию – текущую дату.
Создаем новую пользовательскую форму с именем UserForm2. Если у вас другое имя формы, это не имеет значения, так как обращаться к ней будем с помощью ключевого слова «Me». Открываем модуль созданной формы и вставляем в него следующий код VBA Excel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Private Sub UserForm_Initialize() Dim myTextBox As Control ‘Создаем новый TextBox и присваиваем его переменной Set myTextBox = Me.Controls.Add(«Forms.TextBox.1») ‘Задаем размеры и заголовок пользовательской формы With Me .Height = 100 .Width = 220 .Caption = «Форма №2» End With ‘Присваиваем значения свойствам текстового поля With myTextBox .Width = 100 .Height = 20 ‘Left и Top рассчитаны для Excel 2016* .Left = 60 — 5 .Top = 40 — 15 ‘Добавляем всплывающую подсказку .ControlTipText = «Введите дату подписания договора» ‘Вставляем в поле текущую дату .Text = Format(Now, «DD.MM.YYYY») ‘Выравниваем текст по центру .TextAlign = 2 End With End Sub |
В результате выполнения кода откроется следующая форма с всплывающей подсказкой при наведении на TextBox курсора:
* Значения свойств Left и Top рассчитаны для Excel 2016. Вычитаемые числа зависят от толщины границ пользовательской формы, которые в других версиях Excel могут отличаться.
Fedor_sumkin 0 / 0 / 0 Регистрация: 29.03.2015 Сообщений: 4 |
||||
1 |
||||
02.04.2015, 14:08. Показов 18735. Ответов 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 |
Как разрешить ввод только чисел в текстовое поле?
В 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)
Оценок пока нет. Оцените первым!
Время создания: 16.03.2019 23:43 Текстовые метки: Excel, TextBox, VBA, текстбокс Раздел: !Закладки — VBA — Форма Запись: xintrea/mytetra_db_adgaver_new/master/base/151440704601ozzomq3n/text.html на raw.githubusercontent.com
|
||||||||||||||||||||||||||||||||||||||||
Элемент управления TextBox TextBox используется для ввода/вывода текста, который в последующем используется в программе, или для вывода результатов расчетов программы. Текст, введенный в поле, обычно в программе преобразуется либо в числа, либо в формулы.
рис . 1.1 Элемент управления Textbox на панели ToolBox рис. 1.2 Элемент управления Textbox на форме Основные свойства элемента упраления TextBox:
Ввод в TextBox только определенных символов: Иногда требуется, чтобы в текстовое поле можно было вводить только определенные символы, например числа, в этом случае поможет следующий код: Function OnlyMySymbols (Symbol As Integer, Pattern as string) as Integer Применяется код так, если в поле Textbox1 необходимо разрешить введение только чисел: Private Sub Textbox1_KeyPress (KeyAscii As Integer) Быстрое заполнение полей TextBox: Sub All_TextBoxes() Dim li As Long For li = 1 To 10 UserForm1.Controls(“TextBox” & li).Value = li Next li End Sub Недостаток данного метода: имена элементов должны строго соответствовать используемым в коде и лишь нумерация на конце имени должна различаться. В примере TextBox с именами от “TextBox1″ до “TextBox10″ будут подставлены значения номеров самих TextBox. Достоинства данного метода: В зависимости от имени можно проделывать различные действия: стирать значения, менять свойства элементов и т.д. Обзорная статья про элементы управления предоставлена здесь |
||||||||||||||||||||||||||||||||||||||||
Так же в этом разделе:
|
||||||||||||||||||||||||||||||||||||||||
|
-
#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
Ввод в TextBox числовых значений. |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |