Я предлагаю Вам использовать этот код, я думаю, что его достаточно для Вашей задачи. Ваш же код мне кажется более сложным и нет смысла его использовать. Tag это свойство TextBox'а, куда можно записывать данные для каких-то целей. Своего рода это переменная.
Десятичный разделитель запятая (код 44).
Код
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 44, 48 To 57
Case Else
KeyAscii = 0
End Select
End Sub
Karataev, очень странно, что Вы говорите, что этот код не надо использовать. Результат он даёт... почему бы и нет. Взят он также в какого-то форума с этим же вопросом... но вот что делает условие - не понятно. За Ваш вариант также спасибо.
Также, если уж не совсем я обнаглел, как запретить больше одного ввода запятой? Спасибо.
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii >= 48 And KeyAscii <= 57 Then
Exit Sub
End If
If KeyAscii = 44 Then
If InStr(Me.TextBox1.text, ",") Then
KeyAscii = 0
End If
Else
KeyAscii = 0
End If
End Sub
Да, путаница возникла с именами текстобоксом. У меня TextBox1, в Вашем посте 1 TextBox3. У меня Ваш код просто не запускался. Тут и Ваша вина, сводите с ума: в приложенном файле у Вас TextBox1.
Смысл Вашего кода такой. В тег запоминается число, которое было ранее записано в TextBox. Если в TextBox'е появляется нечисло, то в TextBox записываются данные из тега, т.е. число, которое было ранее, до ввода неправильного символа. Если в конструкции If.. Then есть Else, то лучше используйте такой стиль написания. Так меньше путаницы и быстрее Вам помогут. Ваш способ очень редко кто использует, ни в одном справочнике по VBA Вы не найдете, чтобы было так записано.
Код
Private Sub TextBox1_Change()
If TextBox1.Text Like "*[!0-9]*" Then
TextBox1.Text = TextBox1.Tag
Else
TextBox1.Tag = TextBox1.Text
End If
End Sub
‘Контроль ввода в 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
Добрый день! Юрий М, немного изменил Ваш код из поста #12 (5 цифр после запятой) и вставил отображение введенного значения в ТектБокс1 в ячейке A1
Код
Sheets("Лист1").Range("A1").Value = Me.TextBox1
Обнаружилось, что в ТекстБокс1 вводится все верно, но на выходе 4 знака после запятой. Чтоб получить 5 знаков нужно нажать дополнительно любую (это не точно, пробовал цифры на NumPad) кнопку. Прошу не кидаться тапками если ответ очевиден для гуру, осваивать VBA начал неделю назад, создал необходимую под мои задачи форму, пытаюсь писать код методом "тыка". P.S. Возможно разобрался (листы и ячейки изменены). Но если выделить мышью или перейти Tab-ом в ТекстБокс3, то сразу с клавиатуры ввод данных не получается, нужно удалить имеющееся и только потом вводить свои (другие) данные. Почему? И как исправить?
Код
Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
txt = Me.TextBox3 ' читаем текст из поля (для недопущения ввода двух и более запятых)
If InStr(1, txt, ",") > 0 And Len(txt) - InStr(1, txt, ",") = 5 Then KeyAscii = 0 ' только 5 цифр после запятой
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
Private Sub TextBox3_Change()
'изменение в Тариф
Sheets("Показания").Range("D5").Value = Me.TextBox3
End Sub
Private Sub UserForm_Initialize()
'отобразить в Текстбокс3 данные ячейки D5 Тариф
Me.TextBox3 = Sheets("Показания").Range("D5").Value
End Sub
Всем привет! Столкнулся с такой же проблемой, но с одной оговоркой. Если у меня на UserForm изначально нет TextBox и макрос динамически добавляет текст боксы на форму, куда вставить этот код, чтобы он при клике на эти новые текстовые поля срабатывал, уже все перепробовал. Вот так создаю текст бокс и он не реагирует на макрос, который здесь был описан, т.к. фактически он не находит никакого TextBox1, хотя их может быть 1 или несколько, в общем, динамично. Файл приложить не могу, к сожалению
Код
Set tb(i) = ConertUnit.Controls.Add("forms.textbox.1")
With tb(i)
.BackColor = &H80000005
.BackStyle = 1
.BorderStyle = 0
.ForeColor = &H80000008
.TextAlign = 2
.Font.Size = 10
.Font.Bold = True
.Font.Name = "Tahoma"
.Top = i * 10 + (i - 1) * 20 'От верхней границы границы формы
.Left = 86
.Height = 18
.Width = 78
End With
SlA_pls, Доброго времени суток. Вы выложили только кусок кода где вы добавляете динамически TextBox. А весь код где вы присваеваете к этому TextBox-у или TextBox-ам событие типа Change или Exit? Может там проблема?