Vba excel textbox только числа

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..

Community's user avatar

asked Oct 1, 2014 at 10:03

AddyProg's user avatar

2

Further to my comment:

Consider a sample Userform1 with a Textbox1 and a CommandButton1

enter image description here

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:

enter image description 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

Ruben Alvarez's user avatar

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

blackworx's user avatar

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 Rout's user avatar

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's user avatar

clemens

16.4k11 gold badges48 silver badges65 bronze badges

answered Dec 17, 2017 at 11:01

Lam Kent's user avatar

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's user avatar

Taazar

1,54518 silver badges27 bronze badges

answered Sep 15, 2020 at 3:06

PEARL FUELS BPCL OUTLET's user avatar

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

Soren V. Raben's user avatar

answered Nov 20, 2020 at 0:32

joseph.T's user avatar

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

M King's user avatar

1

 

Kirill Gureev

Пользователь

Сообщений: 653
Регистрация: 01.01.1970

#1

07.08.2018 22:31:03

Уважаемые коллеги.
Собственно, вопроса то уже нет, поскольку решение найдено. Но вот понять я его не могу, хоть и три строки:

Код
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 Gureev07.08.2018 22:31:50

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#2

07.08.2018 22:39:19

Я предлагаю Вам использовать этот код, я думаю, что его достаточно для Вашей задачи.
Ваш же код мне кажется более сложным и нет смысла его использовать.
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

Изменено: Karataev08.08.2018 07:44:12

 

Logistic

Пользователь

Сообщений: 741
Регистрация: 03.01.2013

Как вариант

Прикрепленные файлы

  • Книга2.xlsm (17.67 КБ)

 

Karataev, очень странно, что Вы говорите, что этот код не надо использовать. Результат он даёт… почему бы и нет. Взят он также в какого-то форума с этим же вопросом… но вот что делает условие — не понятно.
За Ваш вариант также спасибо.

Также, если уж не совсем я обнаглел, как запретить больше одного ввода запятой?
Спасибо.

Изменено: Kirill Gureev07.08.2018 22:53:14

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

Мне Ваш код кажется сложным для понимания, поэтому я Вам советую использовать мой код.

Изменено: Karataev08.08.2018 07:45:02

 

Logistic, спасибо. Очень понятно.
Вопрос тот же, «Как разрешить ввод только одного десятичного знака?»

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#7

07.08.2018 22:59:24

Код
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, сударь, не сводите меня с ума!

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

Да, путаница возникла с именами текстобоксом. У меня TextBox1, в Вашем посте 1 TextBox3. У меня Ваш код просто не запускался.
Тут и Ваша вина, сводите с ума: в приложенном файле у Вас TextBox1.

 

Kirill Gureev

Пользователь

Сообщений: 653
Регистрация: 01.01.1970

#10

07.08.2018 23:06:41

Karataev, согласен)
Однако, вернёмся к самому вопросу… что сие происходит этим куском?

Код
If TextBox3.Text Like "*[!0-9]*" Then _
        TextBox3.Text = TextBox3.Tag _
        Else: TextBox3.Tag = TextBox3.Text
 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#11

07.08.2018 23:11:53

Смысл Вашего кода такой. В тег запоминается число, которое было ранее записано в 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

Изменено: Karataev08.08.2018 07:48:42

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#12

07.08.2018 23:27:36

Я пользуюсь этим:

Код
‘Контроль ввода в 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
 
 

Василий Морозов

Пользователь

Сообщений: 13
Регистрация: 07.02.2023

#14

08.02.2023 16:04:20

Добрый день!
Юрий М,  немного изменил Ваш код из поста #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

Изменено: Morozka10.02.2023 20:13:37
(Уточнение)

 

SlA_pls

Пользователь

Сообщений: 8
Регистрация: 05.04.2021

#15

21.02.2023 13:43:34

Всем привет!
Столкнулся с такой же проблемой, но с одной оговоркой. Если у меня на 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
 

Artem1977

Пользователь

Сообщений: 163
Регистрация: 28.02.2017

SlA_pls, почитайте пожалуйста

здесь

Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit

 

MikeVol

Пользователь

Сообщений: 229
Регистрация: 20.10.2020

Ученик

SlA_pls, Доброго времени суток. Вы выложили только кусок кода где вы добавляете динамически TextBox. А весь код где вы присваеваете к этому TextBox-у или TextBox-ам событие типа Change или Exit? Может там проблема?

 

SlA_pls

Пользователь

Сообщений: 8
Регистрация: 05.04.2021

#18

22.02.2023 11:55:39

Цитата
написал:
SlA_pls, почитайте пожалуйста  здесь

Спасибо большое!

Fedor_sumkin

0 / 0 / 0

Регистрация: 29.03.2015

Сообщений: 4

1

02.04.2015, 14:08. Показов 18717. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

у меня есть код ввода только цифр, при вводе буквы выходит ошибка, как сделать, чтобы выходило окно…к примеру, «Буквы нельзя!!» ??

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Chr(KeyAscii) = "-" And _
InStr(1, TextBox1.Text, "-") = 0 Then
 KeyAscii = 0
TextBox1.Text = "-" & TextBox1.Text
Else
 KeyAscii = IIf(InStr(1, "0123456789" & Chr(8), Chr(KeyAscii)) > 0, KeyAscii, 0)
End If
End Sub



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

02.04.2015, 17:08

2

Непонятно, где тут «выходит ошибка», «переход к коду». При вводе буквы она просто игнорируется.
Чтобы появлялось сообщение, добавьте в конце

Visual Basic
1
If KeyAscii = 0 Then MsgBox "Буквы нельзя!!", vbExclamation



0



Vovchikvsb

466 / 123 / 61

Регистрация: 04.03.2015

Сообщений: 325

02.04.2015, 18:38

3

Лучший ответ Сообщение было отмечено Fedor_sumkin как решение

Решение

Если хотите запретить введение всего, кроме цифр, можно применить такой способ.

Visual Basic
1
2
3
Private Sub TextBox1_Change()
    If TextBox1.Text Like "*[!0-9]*" Then TextBox1.Text = TextBox1.Tag Else TextBox1.Tag = TextBox1.Text
End Sub

Добавлено через 1 час 19 минут
Чуток переделал. Теперь учитывает «-» в начале.

Visual Basic
1
2
3
4
Private Sub TextBox1_Change()
    If TextBox1.Text Like "[!-]*-" Then TextBox1.Text = "-" & Left(TextBox1.Text, Len(TextBox1.Text) - 1)
    If TextBox1.Text Like "?*[!0-9]*" Or TextBox1.Text Like "[!0-9-]" Then TextBox1.Text = TextBox1.Tag Else TextBox1.Tag = TextBox1.Text
End Sub



2



Fedor_sumkin

0 / 0 / 0

Регистрация: 29.03.2015

Сообщений: 4

03.04.2015, 14:47

 [ТС]

4

Спасибо большое всё работает. Я переделал твой код, так чтобы вводились только буквы, и у меня возникла проблема, вводятся лишь заглавные буквы или прописные, можно ли как-нибудь это исправить?

Visual Basic
1
If TextBox2.Text Like "?*[!А-Я]*" Then TextBox2.Text = TextBox2.Tag Else TextBox2.Tag = TextBox2.Tex

t



0



Vovchikvsb

466 / 123 / 61

Регистрация: 04.03.2015

Сообщений: 325

03.04.2015, 15:43

5

Можно сравнивать так

Visual Basic
1
UCase(TextBox2.Text) Like UCase("?*[!А-Я]*")



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

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

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

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), а затем нарисуйте текстовое поле, как вам нужно, см. снимок экрана:

текстовое поле документа только цифры 1

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

текстовое поле документа только цифры 2

3. Затем сохраните и закройте окно кода и выйдите из Режим проектирования, теперь в текстовое поле можно вводить только числа, символ точки и знак минуса, см. снимок экрана:

текстовое поле документа только цифры 3


Статьи по теме:

Как применить проверку орфографии в текстовом поле?

Как изменить цвет текстового поля в зависимости от значения в Excel?

Как вставить картинку в текстовое поле?

Как установить значение по умолчанию в текстовом поле?


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (3)


Оценок пока нет. Оцените первым!

Формулировка задачи:

у меня есть код ввода только цифр, при вводе буквы выходит ошибка, как сделать, чтобы выходило окно…к примеру, «Буквы нельзя!!» ??

Код к задаче: «Разрешить ввод в TextBox только цифр»

textual

Private Sub TextBox1_Change()
    If TextBox1.Text Like "*[!0-9]*" Then TextBox1.Text = TextBox1.Tag Else TextBox1.Tag = TextBox1.Text
End Sub

Полезно ли:

15   голосов , оценка 4.200 из 5

Время создания: 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: 

Свойство

Назначение

AutoSize

Определяет,   изменяет ли объект автоматически размеры, чтобы показать   его все содержание.Допустимые   значения:True —   Автоматически изменяет размеры контроля, чтобы показать   его все содержание.False —   Держит размер контроля постоянным.

AutoTab

Определяет,   происходит ли автоматическая табуляция, когда пользователь вводит   максимальное допустимое число символовДопустимые   значения:True —   табуляция происходит.False —   табуляция не происходит (значение по умолчанию).

AutoWordSelect

Определяет,   что являются (слово или знак) основной единицей, используемой,   чтобы определить выбор.Допустимые   значения:True —   Использует слово как основную единицу (значение по умолчанию).False —   Использует знак как основную единицу.

BackColor

Определяет   цвет фона объекта.Параметры:Вы можете   использовать любое целое число, которое представляет правильный цвет.   Вы можете также определить цвет при использовании функции   RGB с красными, зелеными, и синими цветными компонентами. Значение   каждого цветного компонента — целое число, которое колеблется   от нуля до 255. Например, Вы можете определить цвет, синего   как целочисленное значение 4966415 или как красные, зеленые,   и синие цветные компоненты 15, 200, 75.Комментарии:   Вы можете только видеть цвет фона объекта, если свойство BackStyle   установлено в fmBackStyleOpaque.

BackStyle

Устанавливает фоновый   стиль для объекта.Параметры   настройки для fmBackStyle:

  • fmBackStyleTransparent=        0 — Фон прозрачен
  • fmBackStyleOpaque =1 —        Фон непрозрачен (значение по умолчанию).

Комментарии:   Свойство BackStyle определяет, прозрачно ли управление.   Если BackStyle — fmBackStyleOpaque, управление не прозрачно,   и Вы ничего не можете видеть позади управления на форме.   Если BackStyle — fmBackStyleTransparent, Вы можете видеть через   управление и смотреть на что-нибудь  на форме,   расположенной позади управления.

BorderColor

Определяет   цвет границы объектаПараметры:   Вы можете использовать любое целое число, которое представляет   правильный цвет. Вы можете также определить цвет при использовании   функции RGB с красными, зелеными, и синими цветными компонентами.   Значение каждого цветного компонента — целое число, которое колеблется   от нуля до 255. Комментарии: Чтобы использовать свойство   BorderColor, свойство BorderStyle должно быть установлено в значение   кроме fmBorderStyleNone. BorderStyle использует BorderColor, чтобы определить   выделяющие цвета. 

BorderStyle

Определяет   тип границы, используемой управлением или формой.fmBorderStyleNone=0 —   У управления нет никакой видимой линии обрамленияfmBorderStyleSingle   = 1 — У управления есть граница одиночной линии.Значение   по умолчанию для ComboBox, Кадра, Метки, Окна списка или   TextBox 0 (Ни один). Значение по умолчанию для Изображения 1   (Сингл).

CanPaste

Определяет,   содержит ли Буфер обмена данные, которые поддерживает объект.Допустимые   значения:True — Объект   под курсором мыши может получить информацию, вставленную от Буфера   обмена (значение по умолчанию).False —   Объект под курсором мыши не может получить информацию, вставленную   от Буфера обмена.

Text

Возвращает   текст, содержащийся в поле 

Visible

Допустимые   значения:True (поле   отображается во время выполнения программы)False (в   противном случае) 

Enabled

Допустимые   значения:True   (пользователь непосредственно может вносить изменения в содержание   поля)False (в   противном случае) 

Multiline

Допустимые   значения:True   (устанавливается многострочный режим ввода текста)False   (однострочный режим) 

WordWrap

Допустимые   значения:True   (устанавливается режим автоматического переноса)False (в   противном случае) 

AutoSize

Допустимые   значения:True   (устанавливается режим автоматического изменения размера поля так, чтобы весь   вводимый текст помещался в нем)False   (устанавливаетя фиксированный размер поля) 

ScrollBars

Устанавливает   режим отображения в поле полос прокрутки. Допустимые значения:

  • fmScrollBarsNone (не выводить        полос прокрутки)
  • fmScrollBarsHorizontal        (выводить горизонтальную полосу прокрутки)
  • fmScrollBarsVertical        (выводить вертикальную полосу прокрутки)
  • fmScrollBarsBoth (выводить        горизонтальную и вертикальную полосы прокрутки)

SelLenghtSelStartSelText

Эти свойства   характеризуют выделенный в поле фрагмент текста (длина, начало   и сам фрагмент текста соответственно) 

MaxLenght

Устанавливает   максимальное допустимое количество вводимых в поле символов.   Если это свойство равно 0, то нет ограничений   на вводимое количество символов. 

PasswordChar

Устанавливает   символ,отображаемый при вводе пароля. Если это свойство   определено, то вместо вводимых символов в поле будет отображаться   установленный символ 

 Ввод в TextBox только определенных символов:

Иногда требуется, чтобы в текстовое поле можно было вводить только определенные символы, например числа, в этом случае поможет следующий код:

Function OnlyMySymbols (Symbol As Integer, Pattern as string) as Integer
If InStr (Pattern & Chr (8), Chr (Symbol)) > 0 Then
OnlyMySymbols = Symbol
Else
OnlyMySymbols = 0
End If
End Function

Применяется код так, если в поле Textbox1 необходимо разрешить введение только чисел:

Private Sub Textbox1_KeyPress (KeyAscii As Integer)
KeyAscii = OnlyMySymbols (KeyAscii, “0123456789.»)
End Sub

Быстрое заполнение полей 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.

Достоинства данного метода:  В зависимости от имени можно проделывать различные действия: стирать значения, менять свойства элементов и т.д.

Обзорная статья про элементы управления предоставлена здесь

Так же в этом разделе:

  • Элементы управления VBA: название, значок, описание
  • Элементы управления VBA, добавление элементов управления на форму
  • TabStrip
  • Multipage
  • Image
  • RefEdit
  • Label
  • TextBox
  • Combobox
  • ListBox
  • TextBox, Frame, CheckBox
  • CheckBox
  • OptionButton
  • Frame
  • CommandButton
  • ToggleButton
  • ScrollBar
  • SpinButton
  • Использование классов для элементов управления на форме
  • Проверка ввода числа в текстовое поле на форме VBA
  • ‘==================== Проверка ввода
  • Как убрать заголовок у UserForm VBA
  • Как быстро заполнить/очистить элементы на форме(TextBox-ы, ComboBox-ы)
  • VBA/Listbox прокрутка колесиком мыши
  • Вертикальный скроллинг по ListBox
  • Высота строки по содержимому в ListView vba
  • Общие сведения о формах, элементах управления форм и элементах ActiveX на листе
  • Создание массива контролов в VBA, Управление массивом контролов по событию
  • программное создание контролов, MS Access
  • Обращение к контролам с помощью объекта «Controls»
  • Календарь на форме
  • Визуализация работы макроса при помощи прогресс-бара
  • Отобразить процесс выполнения
  • Позиционирование формы возле ячейки Excel 2007+ без Win API (VBA)
  • Определение разрешения экрана

MyTetra Share v.0.58

Яндекс индекс цитирования
  • Remove From My Forums
  • Вопрос

  • Добрые люди помогите. Нужно для Textbox написать код обработки символов вводимых с к лавиатуры.

    Вот какие параметры.

    1.Ввод только чисел

    2.Числа только положительные

    3.Ввод как целых (1) так и чисел с десятичной точкой (0,10)

    4.Желательно ограничить ввод чисел после запятой до 2 знаков (формат 0,00)

    вот что пока удалось найти

    Private Sub my_KPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox2.KeyPress
    
        Dim c As Char = e.KeyChar
        'Если символ цифра или знак препинания
        If Char.IsDigit(c) Or Char.IsPunctuation(c) Then
          If Char.IsPunctuation(c) Then
            If sender.text.contains(",") Then
              'Если уже есть(,) запрещаем ввод
              e.Handled = True
            Else
              e.KeyChar = ","
            End If
          End If
          'Разрешаем BACKSPACE(удаление)
        ElseIf Asc(c) = 8 Then
        Else
          'Запрещаем вводить все остальные символы
          e.Handled = True
        End If
      End Sub

    Но есть свои недостатки:

    Пмогите подправить

    1.Запретить вводить Ноль если он в строке первый(должно быть так 0 а не так 00000)

    2.Запретить вводить разделитель (,) первым

    3.Ограничить ввод знаков после запятой до двух

    4.Установить предел вводимых чисел например От 0 до 270

    • Перемещено

      1 октября 2010 г. 20:59
      MSDN Forums Consolidation (От:Начинающие разработчики)

Ответы

  • Вот вроде набросал рабочий вариант спасибо американам.

    1)Данный код удобен тем, что нет необходимости повторять его

    просто нужно перечислить названия textbox через запятую.

    напр.  (Handles TextBox1.KeyPress, TextBox2.KeyPress)

    'Ограничение ввода символов с клавиатуры для TextBox1 и TextBox2
      Private Sub my_KPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox2.KeyPress
    
        Dim c As Char = e.KeyChar
        'Если код лежит в диапазоне кодов цифр или 
        'знаков препинания: разрешаем ввод с клавы
        If Char.IsDigit(c) Or Char.IsPunctuation(c) Then
          If Char.IsPunctuation(c) Then
            'Запрещаем вводить вторую запятую
            If sender.text.contains(",") Then
              e.Handled = True
              Beep()
            Else
              e.KeyChar = ","
            End If
          End If
          If Char.IsDigit(c) Then
            'Ввод только двух знаков после запятой
            If (sender.SelectionStart > sender.Text.Length - 2 And sender.Text.IndexOf(",") >= 0 And sender.Text.IndexOf(",") + 3 = sender.Text.Length) Then
              If Asc(c) <> 8 Then
                e.Handled = True
                Beep()
              End If
            End If
            'Запрет на ввод второго ноля если ноль первый
            If (sender.SelectionStart > sender.Text.Length - 1 And sender.Text.IndexOf("0") = 0 And sender.Text.IndexOf("0") + 1 = sender.Text.Length) Then
              If Asc(c) <> 44 Then
                e.Handled = True
                Beep()
              End If
            End If
          End If
          'Разрешаем BACKSPACE(удаление)
        ElseIf Asc(c) = 8 Then
        Else
          'Запрещаем вводить все остальные символы
          e.Handled = True
          MessageBox.Show("Пожалуйста, вводите только цифры.", "Ошибка ввода")
        End If
      End Sub
    2) Второй код использую вместе с первым
    'Устанавливаем предел вводимых чисел для TextBox1
      Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Try
          'Если число не лежит в пределах
          'Удаляем введеный символ и помещаем курсор в конец сроки.
          If Not (CDbl(TextBox1.Text) >= 0 And CDbl(TextBox1.Text) <= 270) Then
            TextBox1.Text = Mid(TextBox1.Text, 1, Len(TextBox1.Text) - 1)
            TextBox1.Select(TextBox1.Text.Length, 0)
            MessageBox.Show("Введите число от 0 до 270", "Ошибка ввода")
          End If
        Catch
          Exit Try
        End Try
      End Sub

    Довольно все прилично выглядет т.к и хотелось

    Если есть более подходящий вариант выкладывайте.

    3)Вот может кому пригодиться

     'Функция округления чисел
      Function Okrugly(ByVal V As Double, ByVal N As Integer)
        'где V - число или выражение(формула) которое нужно округлить
        'где N - До какого знака округляем (точность округления)
        Okrugly = Fix(CDbl(V * 10 ^ N + Math.Sign(V) * 0.5)) / 10 ^ N
      End Function
    • Помечено в качестве ответа
      a.lisov
      3 июля 2010 г. 18:08

Понравилась статья? Поделить с друзьями:
  • Vba excel textbox добавить
  • Vba excel textbox денежный формат
  • Vba excel textbox в ячейку
  • Vba excel textbox mask
  • Vba excel textbox in userform