Vba excel ввод только чисел

 

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, почитайте пожалуйста  здесь

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

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

Содержание

  1. VBA TextBox Numbers Only using Keypress KeyAscii
  2. The VBA Tutorials Blog
  3. Introduction — VBA TextBox Numbers Only
  4. Example — VBA TextBox Numbers Only
  5. Tutorial — VBA TextBox Numbers Only
  6. From the Beginning
  7. Don’t forget to change the name!
  8. Features of this Macro
  9. Application Ideas — VBA TextBox Numbers Only
  10. Vba excel textbox только цифры
  11. Как разрешить ввод только чисел в текстовое поле?
  12. Разделите диапазон ячеек на число с помощью специальной функции «Вставить»
  13. Vba excel textbox только цифры
  14. VB.net Need Text Box to Only Accept Numbers
  15. 29 Answers 29
  16. Simplest ever solution for TextBox Validation in VB.NET

VBA TextBox Numbers Only using Keypress KeyAscii

The VBA Tutorials Blog

Introduction — VBA TextBox Numbers Only

Learn how to restrict a VBA UserForm TextBox to numbers only using the VBA KeyPress event and KeyAscii argument. This macro is flexible enough to also allow negative numbers and decimals in your UserForm TextBoxes.

In case you want to grab the code and go, I’m going to give you the answer up front. I’ll explain how to use it in the Tutorial section.

Example — VBA TextBox Numbers Only

Make powerful macros with our free VBA Developer Kit

This is actually pretty neat. If you have trouble understanding or remembering it, our free VBA Developer Kit can help. It’s loaded with VBA shortcuts to help you make your own macros like this one — we’ll send a copy, along with our Big Book of Excel VBA Macros, to your email address below.

Tutorial — VBA TextBox Numbers Only

From the Beginning

Now that I’ve given you the solution, I’ll set the stage for how to use it. Let’s say you have an Excel UserForm that looks like this:

It’s a simple UserForm, with a TextBox near the center. The TextBox is named TextBox1 , but you can name it whatever you like.

The problem is, there’s no property of the TextBox that will allow you to restrict the input to numbers only. The user can enter any character they want! For your code to function properly, you need to find a way to manually restrict the textbox to numeric values only. I’ll show you how.

From your Project Explorer Pane, right click your UserForm and click View Code.

Once you do that, simply copy and paste the example macro.

Don’t forget to change the name!

If your TextBox isn’t named TextBox1 , you’ll have to make a few changes.

Everywhere you see TextBox1 in the example macro, you’ll have to change that to the name of your TextBox. If you’re counting, there should be 4 replacements, including the one in the name of the subroutine.

Features of this Macro

Fundamentally, this macro prevents letters and special characters from being entered into your TextBox, but it does more than that.

Because the KeyPress event has the KeyAscii argument, which tells you which character is pressed, you can make some pretty powerful character validation procedures. By reading the KeyAscii argument, this macro is able to include a few features that many other TextBox restriction macros do not.

For example, by checking the KeyAscii value this macro lets the user include a dash, but ONLY if the dash is entered as the first character in the TextBox. This allows the user to enter negative numbers.

Likewise, the macro allows the user to enter a decimal, but it only allows one decimal in the TextBox. A string with more than one decimal isn’t a number!

Anytime you see the line KeyAscii = 0 , it’s telling the VBA compiler to not allow the key to be entered into the TextBox. Notice, the only Case in the Select Case logic that doesn’t have a KeyAscii = 0 restriction, is the use of numbers from 0 to 9. Makes sense doesn’t it?

Note, the logical test Case Asc(«0») To Asc(«9») is the same as entering Case 48 to 57 since 48 to 57 are the corresponding ascii codes for the numbers 0 through 9.

Application Ideas — VBA TextBox Numbers Only

Macros that validate TextBox entries as numeric are ideal when creating something like a UserForm calculator.

Now’s the time I ask/beg/plead you to subscribe to my free wellsrPRO VBA Training Program using the form below. Once you subscribe, you’ll get access to a free copy of my Excel Add-In with tons of useful features and you’ll get monthly tutorials where I show you how to do some pretty cool stuff with VBA:)

Ready to do more with VBA?
We put together a giant PDF with over 300 pre-built macros and we want you to have it for free. Enter your email address below and we’ll send you a copy along with our VBA Developer Kit, loaded with VBA tips, tricks and shortcuts.

Before we go, I want to let you know we designed a suite of VBA Cheat Sheets to make it easier for you to write better macros. We included over 200 tips and 140 macro examples so they have everything you need to know to become a better VBA programmer.

Источник

Vba excel textbox только цифры

Как разрешить ввод только чисел в текстовое поле?

В Excel мы можем применить функцию проверки данных, чтобы в ячейки можно было вводить только числа, но иногда я хочу, чтобы в текстовое поле, а также в ячейки вводились только числа. Как принимать только числа в текстовом поле в Excel?

Разделите диапазон ячеек на число с помощью специальной функции «Вставить»

Удивительный! Использование эффективных вкладок в Excel, таких как Chrome, Firefox и Safari!
Экономьте 50% своего времени и сокращайте тысячи щелчков мышью каждый день!

Следующий код VBA может помочь вам вводить числа, точку (.) И отрицательный знак только в текстовое поле, пожалуйста, сделайте следующее:

1. Создайте текстовое поле, нажав Застройщик > Вставить > Текстовое поле (элемент управления ActiveX), а затем нарисуйте текстовое поле, как вам нужно, см. снимок экрана:

2. Затем щелкните текстовое поле правой кнопкой мыши и выберите Просмотреть код из контекстного меню, чтобы открыть Microsoft Visual Basic для приложений окна, а затем замените исходный код следующим кодом VBA в пустой модуль:

Код VBA: разрешить ввод только чисел в текстовое поле:

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

Источник

Vba excel textbox только цифры

Точно))) 1- святое число))) Теперь ввожу 12345, стираю и когда ввожу не число а например букву «р» то вуаля, появляется еденичка

[moder]поправил вверху
это финальная версия от меня.
Все дополнительные «нюансы» исправляй уже сам (думаю, это не сложно будет, если разберешься с уже написанным)[/moder]

Точно))) 1- святое число))) Теперь ввожу 12345, стираю и когда ввожу не число а например букву «р» то вуаля, появляется еденичка

[moder]поправил вверху
это финальная версия от меня.
Все дополнительные «нюансы» исправляй уже сам (думаю, это не сложно будет, если разберешься с уже написанным)[/moder] vdekameron

Сообщение Точно))) 1- святое число))) Теперь ввожу 12345, стираю и когда ввожу не число а например букву «р» то вуаля, появляется еденичка

[moder]поправил вверху
это финальная версия от меня.
Все дополнительные «нюансы» исправляй уже сам (думаю, это не сложно будет, если разберешься с уже написанным)[/moder] Автор — vdekameron
Дата добавления — 19.12.2014 в 11:37

vdekameron Дата: Пятница, 19.12.2014, 11:50 | Сообщение № 7
RAN Дата: Пятница, 19.12.2014, 12:02 | Сообщение № 8
Быть или не быть, вот в чем загвоздка!

Ответить

vdekameron Дата: Пятница, 19.12.2014, 15:28 | Сообщение № 9
vdekameron Дата: Вторник, 23.12.2014, 12:46 | Сообщение № 10
Саня Дата: Вторник, 23.12.2014, 15:10 | Сообщение № 11

замени на это:
[vba]

замени на это:
[vba]

замени на это:
[vba]

vdekameron Дата: Вторник, 23.12.2014, 15:39 | Сообщение № 12

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Option Explicit
Private Vihod As Boolean
Dim P1 As String, P2 As String
Dim KolS As Integer
Dim Simvol As String

Private Sub Text1_Change()
If Vihod Then Exit Sub ‘ зацикливание

Dim Val1 As String, Val2 As Double
Val1 = Text1.Text
If Len(Val1) = 0 Then
P1 = «»
Exit Sub
End If

Val1 = Replace(Val1, «.», «,»)
Select Case True
Case Val1 Like «,*»: Val1 = «0» & Val1
Case Val1 Like «*,»: Val1 = Val1 & «0»
End Select

If IsNumeric(Val1) Then
P1 = Text1.Text
KolS = Len(P1)
Simvol = Mid(P1, KolS, 1)
Select Case Simvol
Case «+»: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
Case «-«: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
End Select
Simvol = Mid(P1, 1, 1)
Select Case Simvol
Case «+»: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
Case «-«: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
End Select
Else
Vihod = True

Text1.Text = P1
End If

Val2 = Val(Replace(Val1, «,», «.»))
Text1.SelStart = Len(Text1)
Me.Caption = Val2 * 2

Vihod = False
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Option Explicit
Private Vihod As Boolean
Dim P1 As String, P2 As String
Dim KolS As Integer
Dim Simvol As String

Private Sub Text1_Change()
If Vihod Then Exit Sub ‘ зацикливание

Dim Val1 As String, Val2 As Double
Val1 = Text1.Text
If Len(Val1) = 0 Then
P1 = «»
Exit Sub
End If

Val1 = Replace(Val1, «.», «,»)
Select Case True
Case Val1 Like «,*»: Val1 = «0» & Val1
Case Val1 Like «*,»: Val1 = Val1 & «0»
End Select

If IsNumeric(Val1) Then
P1 = Text1.Text
KolS = Len(P1)
Simvol = Mid(P1, KolS, 1)
Select Case Simvol
Case «+»: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
Case «-«: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
End Select
Simvol = Mid(P1, 1, 1)
Select Case Simvol
Case «+»: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
Case «-«: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
End Select
Else
Vihod = True

Text1.Text = P1
End If

Val2 = Val(Replace(Val1, «,», «.»))
Text1.SelStart = Len(Text1)
Me.Caption = Val2 * 2

Vihod = False
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Option Explicit
Private Vihod As Boolean
Dim P1 As String, P2 As String
Dim KolS As Integer
Dim Simvol As String

Private Sub Text1_Change()
If Vihod Then Exit Sub ‘ зацикливание

Dim Val1 As String, Val2 As Double
Val1 = Text1.Text
If Len(Val1) = 0 Then
P1 = «»
Exit Sub
End If

Val1 = Replace(Val1, «.», «,»)
Select Case True
Case Val1 Like «,*»: Val1 = «0» & Val1
Case Val1 Like «*,»: Val1 = Val1 & «0»
End Select

If IsNumeric(Val1) Then
P1 = Text1.Text
KolS = Len(P1)
Simvol = Mid(P1, KolS, 1)
Select Case Simvol
Case «+»: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
Case «-«: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
End Select
Simvol = Mid(P1, 1, 1)
Select Case Simvol
Case «+»: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
Case «-«: P1 = Replace(P1, Simvol, «»): Text1.Text = P1
End Select
Else
Vihod = True

Источник

VB.net Need Text Box to Only Accept Numbers

I’m fairly new to VB.net (self taught) and was just wondering if someone out there could help me out with some code. I’m not trying to do anything too involved, just have a TextBox that accepts a numeric value from 1 to 10. I don’t want it to accept a string or any number above 10. If someone types a word or character an error message will appear, telling him to enter a valid number. This is what I have; obviously it’s not great as I am having problems. Thanks again to anyone who can help.

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.

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.

Simplest ever solution for TextBox Validation in VB.NET

First, add new VB code file in your project.

  1. Go To Solution Explorer
  2. Right Click to your project
  3. Select Add >New item.
  4. 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.

You must first validate if the input is actually an integer. You can do it with Integer.TryParse :

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.

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.

Источник

Adblock
detector

Как разрешить ввод только чисел в текстовое поле?

В 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)


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

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



Защита от дурака. Ввод в форму только цифр.

sorcerer

Дата: Суббота, 25.10.2014, 18:43 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

Доброго времени суток. Прошелестел инет и не нашел решения моей проблемы. Требуется организовать в нескольких формах документа возможность ввода только цифр. Организовать в каждой по отдельности удалось следующим SUB-ом.
[vba]

Код

Private Sub Полки_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub

[/vba]

А вот сделать одним SUB-ом для нескольких не удалось. Кто чем…помогите. B)

 

Ответить

krosav4ig

Дата: Суббота, 25.10.2014, 19:27 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 2346


Репутация:

989

±

Замечаний:
0% ±


Excel 2007,2010,2013


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

 

Ответить

sorcerer

Дата: Суббота, 25.10.2014, 19:36 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

krosav4ig, :o А тё и так мона!
Спасибо. Буду учиться дальше %)

 

Ответить

RAN

Дата: Суббота, 25.10.2014, 19:41 |
Сообщение № 4

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Угощаю.

К сообщению приложен файл:

5380423.xls
(84.0 Kb)


Быть или не быть, вот в чем загвоздка!

 

Ответить

sorcerer

Дата: Суббота, 25.10.2014, 20:26 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

RAN, Спасибо. А вот это наглядненько и доступненько yes

 

Ответить

RAN

Дата: Суббота, 25.10.2014, 20:44 |
Сообщение № 6

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Прошелестел инет и не нашел решения моей проблемы

однако, сей файл был выложен не единожды.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Alex_ST

Дата: Суббота, 25.10.2014, 21:41 |
Сообщение № 7

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Спасибо. Очень вкусно. Кто шеф-повар? Или сам готовил?
(хочу к себе в заначку положить, так не плохо было бы копирайт со ссылочкой записать)



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

RAN

Дата: Суббота, 25.10.2014, 21:56 |
Сообщение № 8

Группа: Друзья

Ранг: Экселист

Сообщений: 5645


Моя была :D

С миру по нитке, голому рубаха. ;)


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANСуббота, 25.10.2014, 22:01

 

Ответить

Alex_ST

Дата: Суббота, 25.10.2014, 22:30 |
Сообщение № 9

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

а голодному — верёвка :)
Спасибо. Пригодится.
(Пример, конечно, а верёвка у меня если что и своя есть)



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

sorcerer

Дата: Понедельник, 27.10.2014, 14:09 |
Сообщение № 10

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

С модулями разобрался. Но появилась еще проблема. При изменении значения, меняется программно и количество TextBox-ов. И тут начинает материться проверка. Создал ей динамический архив чтобы учитывались и те TextBox что задал программно и те что нарисовал на форме. Пытался сделать подсчет всех TextBox. При введении значения в TextBox — Вылетает «Could not find the specified object. Может я не туда пихаю. Уже везде пробовал поставить :(
Помогите пожалуйста

К сообщению приложен файл:

3507225.xlsm
(23.0 Kb)

 

Ответить

RAN

Дата: Понедельник, 27.10.2014, 14:39 |
Сообщение № 11

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Задать вопрос по коду, который тянет данные со второго листа, и выложить файл с 1 листом???


Быть или не быть, вот в чем загвоздка!

 

Ответить

sorcerer

Дата: Понедельник, 27.10.2014, 15:01 |
Сообщение № 12

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

RAN, У вас стоит проверка в вашем примере для каждого TextBox. А я хотел сделать для всех Боксов формы, но одной процедурой, методом пересчета их из me.controls, но хоть количество и считается, но проверка дает сбой. Могу выложить полный свой файл.

Сообщение отредактировал sorcererПонедельник, 27.10.2014, 15:04

 

Ответить

sorcerer

Дата: Вторник, 28.10.2014, 22:44 |
Сообщение № 13

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

Задать вопрос по коду, который тянет данные со второго листа, и выложить файл с 1 листом???

Прошу прошения. Просмотрел когда чистил от лишнего. Вот голый пример.

К сообщению приложен файл:

4494460.xlsm
(21.0 Kb)

Сообщение отредактировал sorcererВторник, 28.10.2014, 22:45

 

Ответить

sorcerer

Дата: Среда, 29.10.2014, 00:10 |
Сообщение № 14

Группа: Пользователи

Ранг: Новичок

Сообщений: 38


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

Вроде разобрался. Добавил строчку [vba][/vba] И работает.

 

Ответить

Использование метода Application.InputBox в VBA Excel, его синтаксис и параметры. Значения, возвращаемые диалогом Application.InputBox. Примеры использования.

Метод Application.InputBox предназначен в VBA Excel для вывода диалогового окна с более расширенными возможностями, чем диалоговое окно, отображаемое функцией InputBox. Главным преимуществом метода Application.InputBox является возможность автоматической записи в поле ввода диапазона ячеек (в том числе одной ячейки) путем его выделения на рабочем листе книги Excel и возвращения различных данных, связанных с ним, а также проверка соответствия возвращаемого значения заданному типу данных.

Синтаксис метода

Application.InputBox ( Prompt , Title , Default , Left , Top , HelpFile , HelpContextID , Type )

Обязательным параметром метода Application.InputBox является Prompt, если значения остальных параметров явно не указаны, используются их значения по умолчанию.

Обратите внимание на то, что

  • оператор InputBox вызывает функцию InputBox, а
  • оператор Application.InputBox вызывает метод InputBox.

Чтобы не было путаницы, метод InputBox пишут как метод Application.InputBox, в том числе и в справке разработчика.

Параметры метода

Параметр Описание Значение по умолчанию
Prompt Обязательный параметр. Выражение типа String, отображаемое в диалоговом окне в виде сообщения, приглашающего ввести данные в поле. Разделить на строки сообщение можно с помощью константы vbNewLine. Нет
Title Необязательный параметр. Выражение типа Variant, отображаемое в заголовке диалогового окна. Слово «Ввод»
Default Необязательный параметр. Выражение типа Variant, отображаемое в поле ввода при открытии диалога.  Пустая строка
Left Необязательный параметр. Выражение типа Variant, определяющее в пунктах расстояние от левого края экрана до левого края диалогового окна (координата X).* Горизонтальное выравнивание по центру**
Top Необязательный параметр. Выражение типа Variant, определяющее в пунктах расстояние от верхнего края экрана до верхнего края диалогового окна (координата Y).* Приблизительно равно 1/3 высоты экрана***
HelpFile Необязательный параметр. Выражение типа Variant, указывающее имя файла справки для этого поля ввода. Нет****
HelpContextID Необязательный параметр. Выражение типа Variant, указывающее идентификатор контекста в справочном разделе файла справки. Нет****
Type Необязательный параметр. Выражение типа Variant, указывающее тип возвращаемых данных. 2 (текст)

* Параметры Left и Top учитываются при отображении диалогового окна методом Application.InputBox в Excel 2003, а в последующих версиях Excel 2007-2016 уже не работают.
**При первом запуске горизонтальное выравнивание устанавливается по центру, при последующих — форма отобразиться в том месте, где ее последний раз закрыли.
***При первом запуске вертикальное расположение приблизительно равно 1/3 высоты экрана, при последующих — форма отобразиться в том месте, где ее последний раз закрыли.
**** Если будут указаны параметры HelpFile и HelpContextID, в диалоговом окне появится кнопка справки.

Возвращаемые значения

Диалоговое окно, созданное методом Application.InputBox, возвращает значение типа Variant и проверяет соответствие возвращаемого значения типу данных, заданному параметром Type. Напомню, что тип значений Variant является универсальным контейнером для значений других типов, а в нашем случае для возвращаемых в зависимости от значения параметра Type.

Аргументы параметра Type и соответствующие им типы возвращаемых значений:

Type Возвращаемое значение
0 Формула
1 Число
2 Текст (string)
4 Логическое значение (True или False)
8 Ссылки на ячейки в виде объекта Range
16 Значение ошибки (например, #н/д)
64 Массив значений

Примеры

В отличие от других встроенных диалоговых окон VBA Excel, Application.InputBox при запуске процедуры непосредственно из редактора, открывается прямо в редакторе, и, чтобы выбрать диапазон ячеек на рабочем листе, нужно по вкладке браузера перейти в книгу Excel. Поэтому для тестирования диалога Application.InputBox удобнее создать кнопку, перетащив ее на вкладке «Разработчик» из «Элементов управления формы» (не из «Элементов ActiveX») и в окошке «Назначить макрос объекту» выбрать имя тестируемой процедуры. Чтобы можно было выбрать процедуру сразу при создании кнопки, она должна быть уже вставлена в стандартный программный модуль. Можно назначить процедуру кнопке позже, кликнув по ней правой кнопкой мыши и выбрав в контекстном меню «Назначить макрос…».

Пример 1 — параметры по умолчанию

Тестируем метод Application.InputBox с необязательными параметрами по умолчанию. Аргумент параметра Type по умолчанию равен 2.

Sub Test1()

Dim a As Variant

a = Application.InputBox(«Выберите ячейку:»)

MsgBox a

End Sub

Скопируйте код и вставьте в стандартный модуль, для удобства создайте на рабочем листе кнопку из панели «Элементы управления формы» и назначьте ей макрос «Test1». На рабочем листе заполните некоторые ячейки разными данными, нажимайте кнопку, выбирайте ячейки и смотрите возвращаемые значения.

Клик по кнопке «OK» диалога Application.InputBox в этом примере возвращает содержимое выбранной ячейки (или левой верхней ячейки выбранного диапазона), преобразованное в текстовый формат. У дат в текстовый формат преобразуется их числовое представление.

Клик по кнопке «Отмена» или по закрывающему крестику возвращает строку «False».

Пример 2 — возвращение объекта Range

В этом примере тестируем метод Application.InputBox с обязательным параметром Prompt, разделенным на две строки, параметром Title и значением параметра Type равным 8. Так как в данном случае диалог в качестве значения возвращает объект Range, он присваивается переменной с помощью оператора Set. Для этого примера создайте новую кнопку из панели «Элементы управления формы» и назначьте ей макрос «Test2».

Sub Test2()

Dim a As Variant

Set a = Application.InputBox(«Пожалуйста,» _

& vbNewLine & «выберите диапазон:», _

«Наш диалог», , , , , , 8)

MsgBox a.Cells(1)

MsgBox a.Address

End Sub

В первом информационном окне MsgBox выводится значение первой ячейки выбранного диапазона, во втором — адрес диапазона.

Напомню, что обращаться к ячейке в переменной диапазона «a» можно не только по порядковому номеру (индексу) самой ячейки, но и по индексу строки и столбца, на пересечении которых она находится. Например, оба выражения

указывают на первую ячейку диапазона. А в объектной переменной «a» с присвоенным диапазоном размерностью 3х3 оба выражения

указывают на центральную ячейку диапазона.

При использовании метода Application.InputBox происходит проверка введенных данных: попробуйте понажимать кнопку «OK» с пустым полем ввода и с любым введенным текстом (кроме абсолютного адреса). Реакция в этих случаях разная, но понятная.

Есть и отрицательные моменты: при использовании в диалоге Application.InputBox параметра Type со значением равным 8, нажатие кнопок «Отмена» и закрывающего крестика вызывают ошибку Type mismatch (Несоответствие типов). Попробуйте нажать кнопку «Отмена» или закрыть форму диалога.

Решить эту проблему можно, добавив обработчик ошибок. Скопируйте в стандартный модуль код следующей процедуры, создайте еще одну кнопку и назначьте ей макрос «Test3».

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Sub Test3()

Dim a As Variant

‘При возникновении ошибки

‘перейти к метке «Inform»

On Error GoTo Inform

Set a = Application.InputBox(«Пожалуйста,» _

& vbNewLine & «Выберите диапазон:», _

«Наш диалог», , , , , , 8)

MsgBox a.Cells(1)

MsgBox a.Address

‘Выйти из процедуры,

‘если не произошла ошибка

Exit Sub

‘Метка

Inform:

‘Вывести информационное окно с

‘сообщением об ошибке

MsgBox «Диалог закрыт или нажата кнопка « _

& Chr(34) & «Отмена» & Chr(34) & «!»

End Sub

Попробуйте теперь нажать кнопку «Отмена» или закрыть форму диалога крестиком.

Пример 3 — возвращение массива

Скопируйте в стандартный модуль код процедуры ниже, создайте четвертую кнопку и назначьте ей макрос «Test4». В этой процедуре указан только аргумент параметра Type равным 64, остальные необязательные параметры оставлены по умолчанию.

Sub Test4()

Dim a As Variant

a = Application.InputBox(«Выберите диапазон:», , , , , , , 64)

MsgBox a(3, 3)

End Sub

Откройте диалоговую форму, нажав четвертую кнопку, и выберите диапазон размерностью не менее 3х3. Нажмите «OK»: информационное сообщение выведет значение соответствующего элемента массива «a», в нашем случае — «a(3, 3)». Если вы выберите диапазон по одному из измерений меньше 3, тогда строка «MsgBox a(3, 3)» вызовет ошибку, так как указанный элемент выходит за границы массива. Эта же строка по этой же причине вызовет ошибку при нажатии кнопки «Отмена» и при закрытии диалога крестиком. Если закомментировать строку «MsgBox a(3, 3)», то закрываться диалог будет без ошибок и при нажатии кнопки «Отмена», и при закрытии диалога крестиком.

Чтобы не попасть за границу массива используйте функцию UBound для определения наибольшего доступного индекса по каждому из двух измерений, например, вот так:

Sub Test5()

Dim a As Variant

a = Application.InputBox(«Выберите диапазон:», , , , , , , 64)

MsgBox «Максимальный индекс 1 измерения = « & UBound(a, 1) & _

vbNewLine & «Максимальный индекс 2 измерения = « & UBound(a, 2)

End Sub

только присваивайте значения выражений «UBound(a, 1)» и «UBound(a, 2)» числовым переменным. А этот код используйте для ознакомления с работой функции UBound и ее тестирования.

В этой процедуре ошибка выдается при выборе одной ячейки или диапазона в одной строке, очевидно, Excel воспринимает его как одномерный массив. Хотя при выборе диапазона в одном столбце, по крайней мере в Excel 2016, все проходит гладко и вторая строка информационного сообщения отображается как «Максимальный индекс 2 измерения = 1».

Ошибка выдается и при нажатии кнопки «Отмена», и при закрытии диалога крестиком, так как переменная «а» в этом случае еще не является массивом, а мы пытаемся использовать ее как аргумент для функции массива, что и вызывает ошибку.

Пример 4 — возвращение формулы

Возвращение формулы рассмотрим на следующем примере:

Sub Test6()

Dim a As Variant

a = Application.InputBox(«Создайте формулу:», , , , , , , 0)

Cells(1, 1) = a

End Sub

На активном листе Excel заполните некоторые ячейки числами и запустите процедуру на выполнение. После отображения диалога Application.InputBox выбирайте по одной ячейке с числами, вставляя между ними математические операторы. После нажатия на кнопку «OK» формула запишется в первую ячейку активного рабочего листа «Cells(1, 1)» (в текст формулы ее не выбирайте, чтобы не возникла циклическая ссылка). При нажатии на кнопку «Отмена» и при закрытии диалога крестиком в эту ячейку запишется слово «Ложь».

Можно записывать не только математические формулы, но и объединять содержимое ячеек с помощью оператора «&» и многое другое. Только не понятно, для чего это вообще нужно, как, впрочем, и возврат логических, числовых значений и значений ошибки. Вы можете протестировать их возврат с помощью процедуры «Test6», заменив в ней параметр Type метода Application.InputBox соответствующим для возвращения логических, числовых значений и значений ошибки.

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

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

Код к задаче: «Разрешить ввод в 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

Понравилась статья? Поделить с друзьями:
  • Vba excel ввод данных в ячейку
  • Vba excel ввод данных inputbox
  • Vba excel в форме переход
  • Vba excel в документе могут быть персональные данные
  • Vba excel быстрое удаление строк