Vba excel ввод только цифр
Добрый день.
На форме есть три текстбокса в которые вводятся разные значения(цифры через тире ,цифры через запятую и тире и ввод чисел через запятую.
Как запретить ввод второй запятой в ТеxtBox2, чтобы можно было производить ввод только :цифр через запятую и тире: 0,6-8,7.
Добрый день.
На форме есть три текстбокса в которые вводятся разные значения(цифры через тире ,цифры через запятую и тире и ввод чисел через запятую.
Как запретить ввод второй запятой в ТеxtBox2, чтобы можно было производить ввод только :цифр через запятую и тире: 0,6-8,7. parovoznik
Case 44, 46
If Right(Me.TextBox2.Text, 1) = "," Or Right(Me.TextBox2.Text, 1) = "." Then KeyAscii = 0
Case 44, 46
If Right(Me.TextBox2.Text, 1) = "," Or Right(Me.TextBox2.Text, 1) = "." Then KeyAscii = 0
Case 44, 46
If Right(Me.TextBox2.Text, 1) = "," Or Right(Me.TextBox2.Text, 1) = "." Then KeyAscii = 0
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
On Error Resume Next
Select Case KeyAscii
Case 48 To 57, 8
Case 44, 46
If Right(Me.TextBox2.Text, 1) = "," Or Right(Me.TextBox2.Text, 1) = "." Then KeyAscii = 0
Case 45
KeyAscii = 44
KeyAscii = 45
If InStr(1, Me.TextBox2.Text, ",") And InStr(Me.TextBox2.Text, ",", "-") <> 0 Then
'
KeyAscii = 0
End If
Case Else
KeyAscii = 0 ' остальные символы запрещены
KeyAscii = MsgBox("Можно вводить только цифры через запятую и тире", vbInformation, "Запрет ввода")
End Select
End Sub
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
On Error Resume Next
Select Case KeyAscii
Case 48 To 57, 8
Case 44, 46
If Right(Me.TextBox2.Text, 1) = "," Or Right(Me.TextBox2.Text, 1) = "." Then KeyAscii = 0
Case 45
KeyAscii = 44
KeyAscii = 45
If InStr(1, Me.TextBox2.Text, ",") And InStr(Me.TextBox2.Text, ",", "-") <> 0 Then
'
KeyAscii = 0
End If
Case Else
KeyAscii = 0 ' остальные символы запрещены
KeyAscii = MsgBox("Можно вводить только цифры через запятую и тире", vbInformation, "Запрет ввода")
End Select
End Sub
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
On Error Resume Next
Select Case KeyAscii
Case 48 To 57, 8
Case 44, 46
If Right(Me.TextBox2.Text, 1) = "," Or Right(Me.TextBox2.Text, 1) = "." Then KeyAscii = 0
Case 45
KeyAscii = 44
KeyAscii = 45
If InStr(1, Me.TextBox2.Text, ",") And InStr(Me.TextBox2.Text, ",", "-") <> 0 Then
'
KeyAscii = 0
End If
Case Else
KeyAscii = 0 ' остальные символы запрещены
KeyAscii = MsgBox("Можно вводить только цифры через запятую и тире", vbInformation, "Запрет ввода")
End Select
End Sub
devilkurs, спасибо,но точка вводится тоже.(надо что бы только запятая вводилась). Хорошо буду аккуратен при вводе.
devilkurs, спасибо,но точка вводится тоже.(надо что бы только запятая вводилась). Хорошо буду аккуратен при вводе. parovoznik
parovoznik,
Попробуйте этот вариант
-заменяет точку на запятую
- подряд не вводит две запятые
- два тире запрещает
- автоматом ставит тире, если ставить запятую после первого числа вида 0,0
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim iZap%
With Me.TextBox2
Select Case KeyAscii
Case 48 To 57, 8
Case 44, 46
If KeyAscii = 46 Then KeyAscii = 44 'заменим точку на запятую
iZap = (Len(.Text) - Len(Replace(.Text, Chr(KeyAscii), ""))) 'количество запятых в уже введенной строке
If Right(.Text, 1) = "," Then KeyAscii = 0: Exit Sub 'если предыдущий символ "," то запрещаем ввод
If iZap = 1 And InStr(1, .Text, Chr(45)) < 1 Then KeyAscii = 45: Exit Sub 'запятая уже есть, тире нет, то поставим тире
If iZap >= 2 Then KeyAscii = 0 'в веденной строке больше двух запятых, запрещаем ввод
Case 45
If (Len(.Text) - Len(Replace(.Text, Chr(KeyAscii), ""))) >= 1 Then KeyAscii = 0 'если уже есть тире, то запрещаем ввод
Case Else
KeyAscii = 0'MsgBox("Можно вводить только цифры через запятую и тире", vbInformation, "Запрет ввода")
End Select
End With
End Sub
parovoznik,
Попробуйте этот вариант
-заменяет точку на запятую
- подряд не вводит две запятые
- два тире запрещает
- автоматом ставит тире, если ставить запятую после первого числа вида 0,0
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim iZap%
With Me.TextBox2
Select Case KeyAscii
Case 48 To 57, 8
Case 44, 46
If KeyAscii = 46 Then KeyAscii = 44 'заменим точку на запятую
iZap = (Len(.Text) - Len(Replace(.Text, Chr(KeyAscii), ""))) 'количество запятых в уже введенной строке
If Right(.Text, 1) = "," Then KeyAscii = 0: Exit Sub 'если предыдущий символ "," то запрещаем ввод
If iZap = 1 And InStr(1, .Text, Chr(45)) < 1 Then KeyAscii = 45: Exit Sub 'запятая уже есть, тире нет, то поставим тире
If iZap >= 2 Then KeyAscii = 0 'в веденной строке больше двух запятых, запрещаем ввод
Case 45
If (Len(.Text) - Len(Replace(.Text, Chr(KeyAscii), ""))) >= 1 Then KeyAscii = 0 'если уже есть тире, то запрещаем ввод
Case Else
KeyAscii = 0'MsgBox("Можно вводить только цифры через запятую и тире", vbInformation, "Запрет ввода")
End Select
End With
End Sub
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim iZap%
With Me.TextBox2
Select Case KeyAscii
Case 48 To 57, 8
Case 44, 46
If KeyAscii = 46 Then KeyAscii = 44 'заменим точку на запятую
iZap = (Len(.Text) - Len(Replace(.Text, Chr(KeyAscii), ""))) 'количество запятых в уже введенной строке
If Right(.Text, 1) = "," Then KeyAscii = 0: Exit Sub 'если предыдущий символ "," то запрещаем ввод
If iZap = 1 And InStr(1, .Text, Chr(45)) < 1 Then KeyAscii = 45: Exit Sub 'запятая уже есть, тире нет, то поставим тире
If iZap >= 2 Then KeyAscii = 0 'в веденной строке больше двух запятых, запрещаем ввод
Case 45
If (Len(.Text) - Len(Replace(.Text, Chr(KeyAscii), ""))) >= 1 Then KeyAscii = 0 'если уже есть тире, то запрещаем ввод
Case Else
KeyAscii = 0'MsgBox("Можно вводить только цифры через запятую и тире", vbInformation, "Запрет ввода")
End Select
End With
End Sub
Ввод в TextBox только цифр
Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs).
Ввод только текста в TextBox
Здравствуйте. Есть способ разрешить ввод только ЦИФР в текстбокс If Not Char.IsDigit(e.KeyChar).
Ввод в TextBox только определенных символов
Суть проблемы такова: что нужно прописать в окно TextBox, чтобы в поле можно было ввести только.
Ввод только цифр и точки в TextBox
Здравствуйте. Имеется TextBox куда нужно вводить информацию, но нужно сделать так что бы можно.
e - это параметр события TextBox1_KeyPress
Добавлено через 7 минут
значения его свойств можно посмотреть при отладке, если войди в эту процедуру
Присоеденяюсь к Visualist. e - Это не просто буква. это параметр-переменная и у него (неё) есть свойства. То какие свойства у него (параметра) есть определяется тем что написано справа от этого параметра. В данном случае (процедуре) там написано As System.Windows.Forms.KeyPressEventArgs. Главное здесь - это KeyPressEventArgs. Key - клавиша, Press - нажатие, Event - событие, а Args (Вродебы) Аргументы (или свойства по-русски). Соответственно KeyChar и Handled - это свойства события нажатия клавиши (клавиатуры, не мыши). KeyChar - это символ той клавиши, которую ты нажимаешь в тот момент когда курсор стоит в TextBox1.
Handled - тоже свойство логического типа (принимает логические значения True или False)и переводится как "Обработано". Объясню по подробней: Есть процедуры, а есть события. Процедуры (программный код) запускается когда наступает какое-то событие. В данном случае наше событие - это нажатие клавиши на клавиатуре при присутствии курсора в TextBox1. Об этом нам говорит конец второй строчки Private Sub. Handles TextBox1.KeyPress (Частная процедура "Название" ("Параметры") Handles (Обрабатывает) TextBox1.KeyPress (Название события). В начале свойство Handled имеет значение False, а после того как процедура закончится, событие обработается и этому свойству будет присвоено значение True (т.е. Обработано = Правда). И если мы присваиваем свойству Handled значение True заранее (еще в процедуре), то оно (событие) после окончания процедуры не будет, как бы, "повторно" обработано и символ нажатой клавиши в текст бокс не попадёт.
P. S.: Можно еще добавить стирание клавишей Delete в первом условии
29 Answers 29
You can do this with the use of Ascii integers. Put this code in the Textbox's Keypress event. e.KeyChar represents the key that's pressed. And the the built-in function Asc() converts it into its Ascii integer.
I found the code to be most useful, but wanted to give you guys a heads up that this code will not prevent someone from pasting in any of the non-desired characters as the keypress event does not occur during the paste and multiple characters can be pasted in too during the paste. I would suggest an additional line of checking the resultant string being entered for conformance to what is acceptable as an end result.
I give you an upvote for thinking of copy/paste, but I found this acutally has the opposite problem. You can't copy/paste letters, but you also can't copy/paste numbers.
This is what I did in order to handle both key entry and copy/paste.
If you want to allow decimals and negative amount, add
to the if statement in the KeyPress section.
First, add new VB code file in your project.
- Go To Solution Explorer
- Right Click to your project
- Select Add >New item.
- Add new VB code file (i.e. example.vb)
or press Ctrl + Shift + A
COPY & PASTE following code into this file and give it a suitable name. (i.e. KeyValidation.vb)
Now use following code to Form Load Event like below.
I've used this method a couple times now in different projects and it's always worked perfectly for my needs. Thanks for sharing!
You must first validate if the input is actually an integer. You can do it with Integer.TryParse :
This seems to be the answer which most closely matches the question without doing a complex key handling.
You could avoid any code by using a NumericUpDown control rather than a text box, this automatically only allows numbers and has a max and min. It also allow accessing the number directly with NumericUpDown1.Value as well as using up and down arrows to set the number. Also if a number higher/over the max is entered it will jump to the nearest allowed number.
True, although NumericUpDown is usually best for entering smaller numbers. I would think it odd to have those up/down arrows on an input field where I am expected to enter a number in thousands or millions, like dollar amounts. Less importantly, NumericUpDown have annoying UI problems related to the font size.
This allow you to use delete key and set decimal points
I know this post is old but I wanted to share something I have implemented to turn a TextBox into what I call an IntBox.
First you need to make an extension with:
Then make a TextChanged event sub:
Then whenever the user enters text it evaluates the string and only returns numeric values that are within the bounds of a standard Integer. With the "-" character you can change the integer from positive to negative and back again.
If anyone sees anything that can improve this code let me know but my tests show this works fantastic to make an IntBox.
EDIT: I found another method that can work if you use properties in your code. (Note this will need a separate property per TextBox)
First create the property:
Then make the binding in your window's main class:
Finally here is the ToInteger Extension Code I set up:
With all these combined whenever they type something into the box it will act as if it were a textbox but when they change focus the ToInteger extension will set the value as an integer into the property and return it to the textbox.
Meaning that if the operator entered "-1w3" after focus changes it will return as "-13" automatically.
Приносим извинения. Запрошенное содержимое было удалено. Вы будете автоматически перенаправлены через 1 секунду.
Лучший отвечающий
Вопрос
Добрые люди помогите. Нужно для Textbox написать код обработки символов вводимых с к лавиатуры.
Вот какие параметры.
1.Ввод только чисел
2.Числа только положительные
3.Ввод как целых (1) так и чисел с десятичной точкой (0,10)
4.Желательно ограничить ввод чисел после запятой до 2 знаков (формат 0,00)
вот что пока удалось найти
Но есть свои недостатки:
1.Запретить вводить Ноль если он в строке первый(должно быть так 0 а не так 00000)
2.Запретить вводить разделитель (,) первым
3.Ограничить ввод знаков после запятой до двух
4.Установить предел вводимых чисел например От 0 до 270
Ответы
Вот вроде набросал рабочий вариант спасибо американам.
1)Данный код удобен тем, что нет необходимости повторять его
просто нужно перечислить названия textbox через запятую.
напр. (Handles TextBox1.KeyPress, TextBox2.KeyPress)
Довольно все прилично выглядет т.к и хотелось
Если есть более подходящий вариант выкладывайте.
3)Вот может кому пригодиться
Все ответы
'Проверка вводимых символов для TextBox2
Private Sub TextBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
Try
'Проверяем является ли введенный символ числом и положительным.
If Double.Parse(TextBox2.Text) < 0 Then
'Если число отрицательное, то удаляем введеный символ и помещаем курсор в конец сроки.
TextBox2.Text = Mid(TextBox2.Text, 1, Len(TextBox2.Text) - 1)
TextBox2.Select(TextBox2.Text.Length, 0)
Beep()
Else
'Если число положительное и в пределах, то текст зеленый.
If Double.Parse(TextBox2.Text) > 0 And Double.Parse(TextBox2.Text) TextBox2.ForeColor = Color.Green
Else
'Иначе удаляем введеный символ и помещаем курсор в конец сроки.
If Double.Parse(TextBox2.Text) <> 0 Then
TextBox2.Text = Mid(TextBox2.Text, 1, Len(TextBox2.Text) - 1)
TextBox2.Select(TextBox2.Text.Length, 0)
Beep()
Else
TextBox2.ForeColor = Color.Black
End If
End If
End If
Catch
'При ошибке удаляем введеный символ и помещаем курсор в конец сроки.
If TextBox2.Text <> Nothing Then
TextBox2.Text = Mid(TextBox2.Text, 1, Len(TextBox2.Text) - 1)
TextBox2.Select(TextBox2.Text.Length, 0)
Beep()
End If
End Try
В этом коде символ в textbox печатается и если он не сответствует условиям удаляется
и звучит звуковой сигнал
Прошу всех выкладывайте здесь свои наработки буду рад любой идеи даже частичному решению вопроса.
Доброго времени суток. Прошелестел инет и не нашел решения моей проблемы. Требуется организовать в нескольких формах документа возможность ввода только цифр. Организовать в каждой по отдельности удалось следующим SUB-ом.
[vba]
Private Sub Полки_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii >57 Then KeyAscii = 0
End Sub
А вот сделать одним SUB-ом для нескольких не удалось. Кто чем. помогите.
Доброго времени суток. Прошелестел инет и не нашел решения моей проблемы. Требуется организовать в нескольких формах документа возможность ввода только цифр. Организовать в каждой по отдельности удалось следующим SUB-ом.
[vba]
Private Sub Полки_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii >57 Then KeyAscii = 0
End Sub
А вот сделать одним SUB-ом для нескольких не удалось. Кто чем. помогите. sorcerer
Private Sub Полки_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii >57 Then KeyAscii = 0
End Sub
А вот сделать одним SUB-ом для нескольких не удалось. Кто чем. помогите. Автор - sorcerer
Дата добавления - 25.10.2014 в 18:43
Спасибо. Очень вкусно. Кто шеф-повар? Или сам готовил?
(хочу к себе в заначку положить, так не плохо было бы копирайт со ссылочкой записать)
Спасибо. Очень вкусно. Кто шеф-повар? Или сам готовил?
(хочу к себе в заначку положить, так не плохо было бы копирайт со ссылочкой записать) Alex_ST
Спасибо. Очень вкусно. Кто шеф-повар? Или сам готовил?
(хочу к себе в заначку положить, так не плохо было бы копирайт со ссылочкой записать) Автор - Alex_ST
Дата добавления - 25.10.2014 в 21:41
С миру по нитке, голому рубаха.
С миру по нитке, голому рубаха. RAN
Быть или не быть, вот в чем загвоздка!
С миру по нитке, голому рубаха. Автор - RAN
Дата добавления - 25.10.2014 в 21:56
а голодному - верёвка
Спасибо. Пригодится.
(Пример, конечно, а верёвка у меня если что и своя есть) Alex_ST
а голодному - верёвка
Спасибо. Пригодится.
(Пример, конечно, а верёвка у меня если что и своя есть) Автор - Alex_ST
Дата добавления - 25.10.2014 в 22:30
С модулями разобрался. Но появилась еще проблема. При изменении значения, меняется программно и количество TextBox-ов. И тут начинает материться проверка. Создал ей динамический архив чтобы учитывались и те TextBox что задал программно и те что нарисовал на форме. Пытался сделать подсчет всех TextBox. При введении значения в TextBox - Вылетает "Could not find the specified object. Может я не туда пихаю. Уже везде пробовал поставить
Помогите пожалуйста
С модулями разобрался. Но появилась еще проблема. При изменении значения, меняется программно и количество TextBox-ов. И тут начинает материться проверка. Создал ей динамический архив чтобы учитывались и те TextBox что задал программно и те что нарисовал на форме. Пытался сделать подсчет всех TextBox. При введении значения в TextBox - Вылетает "Could not find the specified object. Может я не туда пихаю. Уже везде пробовал поставить
Помогите пожалуйста sorcerer
Читайте также: