Страницы: 1
RSS
VBA - ввод в TextBox только цифр
 
Уважаемые коллеги.
Собственно, вопроса то уже нет, поскольку решение найдено. Но вот понять я его не могу, хоть и три строки:
Код
Private Sub TextBox3_Change()
    If TextBox3.Text Like "*[!0-9]*" Then _
        TextBox3.Text = TextBox3.Tag _
        Else: TextBox3.Tag = TextBox3.Text
End Sub

Объясните мне, пожалуйста, что такое свойство Tag и что тут вообще происходит в условии?
Спасибо.

P.S. Было бы здорово, если бы Вы подсказали как ещё добавить разрешение на ввод десятичного знака.
Изменено: Kirill Gureev - 07.08.2018 22:31:50
 
Я предлагаю Вам использовать этот код, я думаю, что его достаточно для Вашей задачи.
Ваш же код мне кажется более сложным и нет смысла его использовать.
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 - 08.08.2018 07:44:12
 
Как вариант
 
Karataev, очень странно, что Вы говорите, что этот код не надо использовать. Результат он даёт... почему бы и нет. Взят он также в какого-то форума с этим же вопросом... но вот что делает условие - не понятно.
За Ваш вариант также спасибо.

Также, если уж не совсем я обнаглел, как запретить больше одного ввода запятой?
Спасибо.
Изменено: Kirill Gureev - 07.08.2018 22:53:14
 
Мне Ваш код кажется сложным для понимания, поэтому я Вам советую использовать мой код.
Изменено: Karataev - 08.08.2018 07:45:02
 
Logistic, спасибо. Очень понятно.
Вопрос тот же, "Как разрешить ввод только одного десятичного знака?"
 
Код
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
 
Karataev, сударь, не сводите меня с ума!
 
Да, путаница возникла с именами текстобоксом. У меня TextBox1, в Вашем посте 1 TextBox3. У меня Ваш код просто не запускался.
Тут и Ваша вина, сводите с ума: в приложенном файле у Вас TextBox1.
 
Karataev, согласен)
Однако, вернёмся к самому вопросу... что сие происходит этим куском?
Код
If TextBox3.Text Like "*[!0-9]*" Then _
        TextBox3.Text = TextBox3.Tag _
        Else: TextBox3.Tag = TextBox3.Text
 
Смысл Вашего кода такой. В тег запоминается число, которое было ранее записано в 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
Изменено: Karataev - 08.08.2018 07:48:42
 
Я пользуюсь этим:
Код
‘Контроль ввода в 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
Изменено: Morozka - 10.02.2023 20:13:37 (Уточнение)
 
Всем привет!
Столкнулся с такой же проблемой, но с одной оговоркой. Если у меня на 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, почитайте пожалуйста здесь
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
SlA_pls, Доброго времени суток. Вы выложили только кусок кода где вы добавляете динамически TextBox. А весь код где вы присваеваете к этому TextBox-у или TextBox-ам событие типа Change или Exit? Может там проблема?
 
Цитата
написал:
SlA_pls, почитайте пожалуйста  здесь

Спасибо большое!
Страницы: 1
Читают тему
Наверх