mamalot
Пользователь
Сообщений: 136
Регистрация: 24.02.2017
Добрый день.
Мучаюсь второй день (тупой я).
Необходимо чтобы после ввода данных в ячейку макрос проверил данные и если оно не проходят по критериям-выходим.
В ячейку вводятся числа (1,2,3,4,5,6,7,8,9,10,11,12) через запятую в различных комбинациях (может быть просто 4).
Необходимо получить все числа, разделённые запятыми и если хотябы одно число <1 или >12-выходим.
Не могу извлечь числа расположенные между запятыми.
На форуме находил подобные темы, но прикрутить не смог под свой случай.
Макрос в модуле листа:
Код |
---|
Sub Worksheet_Change(ByVal Target As Range) Dim tx As String Dim i As Long Dim t As String If Intersect(Target, Range("B:B")) Is Nothing Then Exit Sub End If If Target.Count > 1 Then Exit Sub tx = Target.Value If Len(tx) = 0 Then Exit Sub For i = 1 To Len(tx) t = Mid(tx, i, 1) If IsNumeric(t) Then MsgBox t If t > 12 Then MsgBox "Неверные данные" End If End If Next i End Sub |
Изменено: mamalot — 21.08.2018 10:23:04
Данный код позволяет выполнять проверку корректности ввода числового значения в текстовое поле (textbox) на форме,
автоматически блокируя ввод запрещенных символов
Используется событие KeyPress элемента управления TextBox
Допустимые символы: цифры от 0 до 9, точка (запятая автоматически заменяется на точку), знак «минус» (перед числом)
Предполагается, что текстовое поле имеет имя TextBox_Multiplier
Private Sub TextBox_Multiplier_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) On Error Resume Next Select Case KeyAscii Case 48 To 57, 8 ' цифры 0 - 9 и <Backspace> (эти символы всегда разрешены) Case 44, 46 ' обработка десятичного разделителя (44 - код запятой, 46 - код точки) KeyAscii = 46 ' если в поле введена запятая, то заменим ее на точку If InStr(1, Me.TextBox_Multiplier.Text, ".") Then KeyAscii = 0 ' вторую точку нельзя Case 45 ' дефис (минус перед числом) If InStr(1, Me.TextBox_Multiplier.Text, "-") Then KeyAscii = 0 ' второй минус нельзя If Me.TextBox_Multiplier.SelStart Then KeyAscii = 0 ' минус допустим только перед числом Case Else KeyAscii = 0 ' остальные символы запрещены End Select End Sub
- 23055 просмотров
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
Проверка переменных и выражений с помощью встроенных функций VBA Excel: IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject.
Проверка переменных и выражений
Встроенные функции VBA Excel — IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject — проверяют значения переменных и выражений на соответствие определенному типу данных или специальному значению.
Синтаксис функций для проверки переменных и выражений:
Expression — выражение, переменная или необязательный аргумент для IsMissing.
Все функции VBA Excel для проверки переменных и выражений являются логическими и возвращают значение типа Boolean — True или False.
Функция IsArray
Описание функции
Функция IsArray возвращает значение типа Boolean, указывающее, является ли переменная массивом:
- True — переменная является массивом;
- False — переменная не является массивом.
Пример с IsArray
Sub Primer1() Dim arr1(), arr2(1 To 10), arr3 Debug.Print IsArray(arr1) ‘Результат: True Debug.Print IsArray(arr2) ‘Результат: True Debug.Print IsArray(arr3) ‘Результат: False arr3 = Array(1, 2, 3, 4, 5) Debug.Print IsArray(arr3) ‘Результат: True End Sub |
Как показывает пример, функция IsArray возвращает True и в том случае, если переменная только объявлена как массив, но еще не содержит значений.
Функция IsDate
Описание функции
Функция IsDate возвращает логическое значение, указывающее, содержит ли переменная значение, которое можно интерпретировать как дату:
- True — переменная содержит дату, выражение возвращает дату, переменная объявлена с типом As Date;
- False — в иных случаях.
Пример с IsDate
Sub Primer2() Dim d1 As String, d2 As Date Debug.Print IsDate(d1) ‘Результат: False Debug.Print IsDate(d2) ‘Результат: True d1 = «14.01.2023» Debug.Print IsDate(d1) ‘Результат: True Debug.Print IsDate(Now) ‘Результат: True End Sub |
Функция IsEmpty
Описание функции
Функция IsEmpty возвращает значение типа Boolean, указывающее, содержит ли переменная общего типа (As Variant) значение Empty:
- True — переменная содержит значение Empty;
- False — переменной присвоено значение, отличное от Empty.
Пример с IsEmpty
Sub Primer3() Dim s As String, v As Variant Debug.Print IsEmpty(s) ‘Результат: False Debug.Print IsEmpty(v) ‘Результат: True v = 125 Debug.Print IsEmpty(v) ‘Результат: False Range(«A1»).Clear Debug.Print IsEmpty(Range(«A1»)) ‘Результат: True Range(«A1») = 123 Debug.Print IsEmpty(Range(«A1»)) ‘Результат: False End Sub |
Как видно из примера, функцию IsEmpty можно использовать для проверки ячеек на содержание значения Empty (пустая ячейка общего формата).
Функция IsError
Описание функции
Функция IsError возвращает логическое значение, указывающее, является ли аргумент функции значением ошибки, определенной пользователем:
- True — аргумент функции является значением ошибки, определенной пользователем;
- False — в иных случаях.
Пользователь может определить одну или несколько ошибок для своей процедуры или функции с рекомендациями действий по ее (их) исправлению. Возвращается номер ошибки с помощью функции CVErr.
Пример с IsError
Допустим, пользователь определил, что ошибка №25 означает несоответствие аргумента функции Vkuba числовому формату:
Function Vkuba(x) If IsNumeric(x) Then Vkuba = x ^ 3 Else Vkuba = CVErr(25) End If End Function Sub Primer4() Debug.Print Vkuba(5) ‘Результат: 125 Debug.Print IsError(Vkuba(5)) ‘Результат: False Debug.Print Vkuba(«пять») ‘Результат: Error 25 Debug.Print IsError(Vkuba(«пять»)) ‘Результат: True End Sub |
Функция IsMissing
Описание функции
Функция IsMissing возвращает значение типа Boolean, указывающее, был ли необязательный аргумент типа данных Variant передан процедуре:
- True — если в процедуру не было передано значение для необязательного аргумента;
- False — значение для необязательного аргумента было передано в процедуру.
Пример с IsMissing
Function Scepka(x, Optional y) If Not IsMissing(y) Then Scepka = x & y Else Scepka = x & » (а необязательный аргумент не подставлен)» End If End Function Sub Primer5() Debug.Print Scepka(«Тропинка», » в лесу») ‘Результат: Тропинка в лесу Debug.Print Scepka(«Тропинка») ‘Результат: Тропинка (а необязательный аргумент не подставлен) End Sub |
Функция IsNull
Описание функции
Функция IsNull возвращает логическое значение, указывающее, является ли Null значением переменной или выражения:
- True — значением переменной или выражения является Null;
- False — в иных случаях.
Пример с IsNull
Функция IsNull особенно необходима из-за того, что любое условие с выражением, в которое входит ключевое слово Null, возвращает значение False:
Sub Primer6() Dim Var Var = Null If Var = Null Then Debug.Print Var ‘Результат: «» If Var <> Null Then Debug.Print Var ‘Результат: «» If IsNull(Var) Then Debug.Print Var ‘Результат: Null End Sub |
Функция IsNumeric
Описание функции
Функция IsNumeric возвращает значение типа Boolean, указывающее, можно ли значение выражения или переменной рассматривать как число:
- True — если аргумент функции может рассматриваться как число;
- False — в иных случаях.
Пример с IsNumeric
Sub Primer7() Debug.Print IsNumeric(«3,14») ‘Результат: True Debug.Print IsNumeric(«четыре») ‘Результат: False End Sub |
Функция IsObject
Описание функции
Функция IsObject возвращает логическое значение, указывающее, является ли переменная объектной:
- True — переменная содержит ссылку на объект или значение Nothing;
- False — в иных случаях.
Функция IsObject актуальна для переменных типа Variant, которые могут содержать как ссылки на объекты, так и значения других типов данных.
Пример с IsObject
Sub Primer8() Dim myObj As Object, myVar As Variant Debug.Print IsObject(myObj) ‘Результат: True Debug.Print IsObject(myVar) ‘Результат: False Set myVar = ActiveSheet Debug.Print IsObject(myVar) ‘Результат: True End Sub |
1 / 1 / 0 Регистрация: 20.04.2012 Сообщений: 46 |
|
1 |
|
Проверка правильности ввода числа05.05.2012, 16:21. Показов 10500. Ответов 5
Здравствуйте. Вот есть две переменные и нужно сделать так, чтоб когда мы вводили какой-то символ или букву вместо числа, при выводе значения писалось ошибку или т.п.. Пытался с IntNum=Aplication.InputBox(…), но при запуске кода, все время выскакивали ошибке в данной строчке.
0 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
05.05.2012, 17:27 |
2 |
|||
1 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
05.05.2012, 17:33 |
3 |
|||
Можно объявить переменные определенного типа и обрабатывать ошибку:
1 |
1 / 1 / 0 Регистрация: 20.04.2012 Сообщений: 46 |
|
05.05.2012, 17:37 [ТС] |
4 |
Хм, интересные варианты. Попробую. Спасибо.
0 |
Dragokas 17992 / 7618 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
||||
05.05.2012, 18:04 |
5 |
|||
Через функцию проверки типа:
1 |
1 / 1 / 0 Регистрация: 20.04.2012 Сообщений: 46 |
|
05.05.2012, 18:40 [ТС] |
6 |
Все варианты подходят, спасибо.
0 |
События:
KeyDown KeyUp KeyPress
Посылаются форме когда производится ввод данных. Событие KeyPress возникает когда пользователь нажимает клавишу, у которой есть ASCII код. Это событие не сгенирируется при нажатии функциональных клавиш. При том эти события есть как у формы:
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) End Sub
Так и у элементов управления TextBox, например:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) End Sub
А это в свою очередь позволяет проверять ввод. Например, если в поле нужно ввести цифру, то легко проверить, что вводит пользователь. События KeyUp и KeyDown применяются для специальных функциональных клавиш или комбинаций типа Ctrl+Del, так как событие KeyPress их не отловит. Удобно использовать данное событие для проверки заполненности полей. Вот форма:
А вот код для нее. В момент нажатия ввода символа в поле проверяется заполненость полей:
Private Sub Test() Dim ctrl As Control Dim bool As Boolean bool = True For Each ctrl In Controls If TypeName(ctrl) = "TextBox" Then If ctrl.Text = "" Then bool = False End If End If Next ctrl UserForm1.CommandButton1.Enabled = bool End Sub Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call Test End Sub Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call Test End Sub Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call Test End Sub