Макрос для проверки значения в ячейке в excel

 

Ronin751

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

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

Доброго времени суток уважаемые жители планеты!
Заранее прошу прощения за создание темы ( её начало

тут

) немного условия поменялись, но проблема та же.
Взываю к Вашей помощи ибо не знаю, что делать с текущей проблемой и как из неё выйти.
  Есть книга с двумя листами. На первом листе таблица (примерно 200 строк, но может меняться).В таблицу, исходя из условий поставленных пользователем, макросом вносятся начальные данные (каждой ячейке или буква, или цифра). Далее пользователь корректирует таблицу уже по фактическим данным. Но при этом есть условия:
1.Буквенные значения ограничены перечнем (именованный диапазон на Листе2) и не заменяются на цифры ( это я решил );
2. Ячейки с исходно числовыми значениями (могут быть целыми или с десятыми), меняются только на буквы или же на изначально (внесенную макросом) цифру.
  Все эти задачи с легкостью решает стандартная «Проверка». Но… Оказывается,при создании Проверки макросом, Экселю тяжело понять, что я от него хочу. (НУ ИЛИ Я СКОРЕЕ НЕ ПРАВИЛЬНО ЕМУ ОБЪЯСНЯЮ)
В файле в ячейке А1 установлена проверка вручную. А в В1 поместить проверку макросом не могу.
Прошу Вашей помощи в решении второго пункта. Заранее огромное спасибо всем за помощь!

 

Пытливый

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

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

Здравствуйте.
Я (честно) пытался понять критерии проверки ячейки, которые вы описываете. Про числа — вообще не понял как.
Пока нашел только то, что счетесли надо писать СЧЁТЕСЛИ (чрез Ё) — функция пишется именно так.
Не знаю, решит это проблему, или нет.
Опять же — проверки у вас — все в процедурах, которые не срабатывают автоматом (не привязаны к событию на листе, изменению значения ячейки там, или еще какому), а написаны в отдельных процедурах, которые надо запускать. Т.е. чтобы макрос начал работать — его надо запустить. Вы меняете значение в нужной ячейке — как макрос поймет, что «уже пора, Коля!»?

Кому решение нужно — тот пример и рисует.

 

Ronin751

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

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

#3

06.05.2016 13:36:08

Здравствуйте Пытливый! Спасибо, что обратили внимание на тему.

Цитата
как макрос поймет, что «уже пора, Коля!»?

Это же я для образца, сделал.  Весь файл очень большой. Вот я только проблемный участок и показал. В реальном файле дело идет так: пользователь, в UserForm отбирает нужные позиции, их количество и подчиненность, нажимает ОК и макрос составляет полную таблицу начальных данных ( если хотите, назовем её неким ГРАФИКОМ или ПЛАНОМ ). Как только таблица составлена, макрос выставляет проверку. А далее пользователь редактирует данные в таблице.
Проблема в том, что цифры, которые изначально проставляет макрос, предугадать нельзя. Но и другие ставить пользователю тоже запрещено. Цифры можно заменять только на буквы из именованного диапазона.
Буду рад любому совету.

 

Пытливый

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

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

#4

06.05.2016 13:47:34

Ну… тогда у вас уже все сделано, т.е. надо определить конкретную ячейку, для которой стараемся (у вас в коде это все для АсtiveCell).
А так я вон макрорекордером записал:

Код
Sub Макрос1()
'
' Макрос1 Макрос
'

'
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=исходник"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
End Sub

Потом выделил В2, запустил — все гуд.

Кому решение нужно — тот пример и рисует.

 

Ronin751

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

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

Да! Ваш пример только на случай замены цифр на букву. Но если пользователь изменил цифру на букву, а через время снова захотел поставить прежнюю цифру, то столкнется с ошибкой. Вот по этому, в примере я использовал другую формулу. Задача составить проверку, которая будет позволять наличие только букв из именованного диапазона или исходной цифры.

Изменено: Ronin75106.05.2016 14:01:11

 

Пытливый

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

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

#6

06.05.2016 13:57:27

Ну добавьте в именованный список значение изначальное и все…

Код
ActiveWorkbook.Names("ИСХОДНИК").Delete 'удаляем именованный диапазон
'копируем из В1 листа 1 в первую пустую столбца А на листе 2
Worksheets("Лист1").Range("B1").copy Worksheets("Лист2").Range("A" & Worksheets("Лист2").Range("A1").CurrentRegion.Rows.Count +1)
'делаем новый именованный диапазон
ActiveWorkbook.Names.Add Name:="ИСХОДНИК", RefersToR1C1:="=Лист2!R1C1:R" & Worksheets("Лист2").Range("A1").CurrentRegion.Rows.Count & "C1"

Изменено: Пытливый06.05.2016 14:14:21

Кому решение нужно — тот пример и рисует.

 

Ronin751

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

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

#7

06.05.2016 14:05:18

Цитата
Ну добавьте в именованный список значение изначальное и все…

С радостью, но я их сам не знаю. Их рассчитывает  макрос. Да и если представить, что в именованом диапазоне будут допустим еще и 5,6,8,9… То, что в этом случае будет мешать пользователю изменить изначальную 9 на 5?!
Но за предложение спасибо!

 

Sanja

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

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

#8

06.05.2016 14:21:41

Цитата
Ronin751 написал: цифры, которые изначально проставляет макрос, предугадать нельзя. Но и другие ставить пользователю тоже запрещено.

Такое не то что макросу не объяснить, тут и человеку-то надо столько выпить, что бы понять… ;)
Не отчаивайтесь, попытайтесь еще раз объяснить.
На сколько я понял на текущий момент — По событию Change нужной ячейке добавляйте значение Target.Value к Списку Проверки данных

Согласие есть продукт при полном непротивлении сторон.

 

Пытливый

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

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

Развивая мысль ув.Sanja, по событию Change
1. сохраняете буквенный массив из диапазона проверки куда-нить
2. очищаете имя с массивом
3. вставляете сохраненные буквы «взад»
4. добавляете нужное значение из ячейки к массиву
5. формируете новый именованный диапазон
6. Ставите проверку на ячейку по этому диапазону.

Ничего не забыл? :)

Кому решение нужно — тот пример и рисует.

 

Sanja

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

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

#10

06.05.2016 14:46:38

«Растекаемся» мыслью дальше

Цитата
Пытливый написал:
5. формируете новый именованный диапазон
6. Ставите проверку на ячейку по этому диапазону.

не обязательно. Проверка данных принимает в качестве Списка строку, которую можно формировать прямо в коде, изначально, без ссылок на диапазоны

Код
With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="1,2,3,4,5,6,7,8,9"
        ....
    End With

Изменено: Sanja06.05.2016 14:51:52

Согласие есть продукт при полном непротивлении сторон.

 

Ronin751

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

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

#11

06.05.2016 15:56:00

Цитата
Не отчаивайтесь, попытайтесь еще раз объяснить

С помощью макроса составляется таблица и заносятся начальные данные. Следующий ход макроса — установить проверку эти ячейки. Условием для устанавки проверки является: если в ячейке текст -значит, при редактировании этой ячейки, допускаются только буквенные значения из именованного диапазона (на листе2); если в ячейке число(допустим 7) — то, при редактировании этой ячейки, допускаются только буквенные значения из именованного диапазона (на лист2) и это число (то есть 7). Фух! Вроде так.
Желтым выделил ячейки в которых уже установил проверку вручную.
Прошу помощи!

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

  • Проверка.xls (47.5 КБ)

 

Sanja

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

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

#12

06.05.2016 16:13:39

?

Код
Sub ПРОВЕРКА()
   Dim j As String, i As Long, w As Long
    j = 14: Do While Cells(j, 4) > "": j = j + 3: Loop: j = j + 1
    For i = 14 To j Step 3
        For w = 5 To 35
            a = Cells(i, w)
            With Cells(i, w).Validation
                .Delete
                If Not IsNumeric(Cells(i, w)) Then
                    S = "А,Б,У,О,ПР,К"
                    errS = "Допускаются только буквенные значения"
                Else
                    X = "=или(счётесли(ИСХОДНИК;" & Cells(i, w).Address & ");счетесли(" & Cells(i, w).Address & ";" & a & "))"
                    S = "А,Б,У,О,ПР,К," & Replace(Cells(i, w), ",", ".")
                    errS = "Допускаются только буквенные значения или " & Replace(Cells(i, w), ",", ".")
                End If
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=S
                    .InCellDropdown = True: .ErrorMessage = errS
                    .ErrorTitle = "Отклонение от условий ": .ShowInput = False: .ShowError = True
            End With
        Next w
    Next i
End Sub

Согласие есть продукт при полном непротивлении сторон.

 

Ronin751

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

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

#13

06.05.2016 17:35:31

Вроде и проверку выполнило но…

Цитата
S = «А,Б,У,О,ПР,К,» & Replace(Cells(i, w), «,», «.»)

В ячейках, где числовое значение записано через запятую, эту самую запятую превращаем в точку. Только проблема возникает при попытке изменить, допустим 4,5 на 4.5. Все равно пишет, что значение не допустимое. И сумма получается уже другая.
Но за мысль и за Ваше внимание спасибо!

 

Sanja

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

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

Да, я это тоже заметил. Если в строку для Проверки вставлять числа с запятой, то Список их разбивает на два значения. Этот пример больше как направление для дальнейшего движения.

Согласие есть продукт при полном непротивлении сторон.

 

Ronin751

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

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

Я это тоже делал, только немного иначе. Сейчас думаю как число с запятой загнать в кавычки (как текст). Тогда проверка, по идее, должна воспринять его.  

 

Sanja

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

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

Можно вернуться к схеме, которую предложил Пытливый, Добавлять значение к диапазону и в Проверку вставлять ссылку на него

Согласие есть продукт при полном непротивлении сторон.

 

Sanja

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

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

#17

07.05.2016 09:02:38

Проверил на практике идею Пытливый,
После этого пункта

Цитата
5. формируете новый именованный диапазон

т.к. всем ячейкам назначается диапазон с одним и тем-же именем (хоть его содержимое и меняется от ячейки к ячейке), то, в итоге, для всех ячеек будет назначен диапазон со значениями для последней ячейки, что логично.
Можно, конечно для каждой ячейки создать свой собственный диапазон, но тогда этих имен будет 31 * кол-во Пунктов.

Согласие есть продукт при полном непротивлении сторон.

 

Ronin751

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

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

#18

07.05.2016 13:30:45

Именно об этом я говорил в посте № 7

Цитата
…да и если представить, что в именованном диапазоне будут допустим еще и 5,6,8,9… То, что в этом случае будет мешать пользователю изменить изначальную 9 на 5?!

И с кавычками у меня не получается. Эксель все равно интерпретирует число с запятой, как два разных. (((
Видимо реально проблема получается?!  :cry:  

 

Sanja

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

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

#19

07.05.2016 13:44:52

Цитата
Ronin751 написал: Именно об этом я говорил в посте № 7

Нет, мы говорим про разные вещи. Но все равно решения нет. Пока
Может более опытные коллеги помогут.
Сузим вопрос.
Как к Списку Проверки данных добавить число с запятой с помощью макроса?
Конкретно — как в нижеприведенном коде добавить к переменной S(строка кода 13) число с запятой в качестве разделителя дробной части?

Или может какое другое решение будет?

Код
Sub ПРОВЕРКА()
   Dim j As String, i As Long, w As Long
    j = 14: Do While Cells(j, 4) > "": j = j + 3: Loop: j = j + 1
    For i = 14 To j Step 3
        For w = 5 To 35
            a = Cells(i, w)
            With Cells(i, w).Validation
                .Delete
                If Not IsNumeric(a) Then
                    S = "А,Б,У,О,ПР,К"
                    errS = ""
                Else
                    S = "А,Б,У,О,ПР,К," & Trim(Str(a))
                    errS = " или " & a
                End If
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=S
                    .InCellDropdown = True: .ErrorMessage = "Допускаются только буквенные значения" & errS
                    .ErrorTitle = "Отклонение от условий ": .ShowInput = False: .ShowError = True
            End With
        Next w
    Next i
End Sub

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

  • Проверка макросом.xls (42.5 КБ)

Изменено: Sanja07.05.2016 13:51:14

Согласие есть продукт при полном непротивлении сторон.

 

Ronin751

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

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

   Вообще, конечно странно… Но видимо приходится констатировать тот факт, что любое (даже текстовое значение) которое записано через запятую в ячейке, с помощью ВБА не возможно добавить в стандартную проверку. Просто потому, что эксель, в этом случае,  не воспринимает запятую как десятичный разделитель, а упорно думает, что это перечисление последовательных (или не последовательных) пунктов.  :cry:
   Но тут появляется вопрос: почему когда в проверку добавляешь значение через запятую, то всё нормально?

 

JeyCi

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

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

#21

08.05.2016 15:18:54

Цитата
Ronin751 написал: с помощью ВБА не возможно добавить в стандартную проверку. Просто потому, что эксель, в этом случае,  не воспринимает запятую как десятичный разделитель, а упорно думает, что это перечисление последовательных

мне кажется не xl, а vba

Цитата
Ronin751 написал: Но тут появляется вопрос: почему когда в проверку добавляешь значение через запятую, то всё нормально?

а тут не vba, а xl
(думаю в вашем вопросе и есть этот ответ)

Изменено: JeyCi08.05.2016 15:19:39

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Ronin751

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

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

Как то странно получается не правда ли? Эксель не понимает ВБА. хм-м.

 

JeyCi

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

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

#23

08.05.2016 16:28:15

Цитата
Ronin751 написал: Эксель не понимает ВБА.

расхождения бывают в рус.яз xl (именно по трактовке запятой и точки-с-запятой в формулах, а также десятичного разделителя)

Изменено: JeyCi08.05.2016 16:30:52

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Ronin751

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

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

Поскольку при попытке создать проверку макросом эксель не воспринимает запятую как десятичный разделитель, решил пойти нахрапом: сменил десятичный разделитель с запятой на точку (меню пуск — панель управления — пункт «Языки и региональные стандарты»). Но эффект тот же (даже если формат ячейки перевести в текстовый).  :evil:  Получается, что с помощью ВБА вообще не возможно передать в проверку значение с любым разделителем?! И это очень прискорбно.  :cry:

 

Юрий М

Модератор

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

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

Вариант: создать именованный динамический (если размер меняется) диапазон и его скармливать Проверке данных.

 

Ronin751

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

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

#26

09.05.2016 18:28:00

Цитата
Вариант: создать именованный динамический

Если я правильно понимаю, то в этом случае придется добавлять новые значения (с разделителями) в именованный динамический диапазон и  в итоге все эти значения будут доступны для каждой ячейки. Но этот вариант не подходит, так как необходимо чтоб список проверки был наполнен значениями (буквенными) из именованного списка и значением самой ячейки ( к примеру «3,5»). Или можно как то это менять?
 

 

Юрий М

Модератор

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

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

Не понимаю проблемы (вопроса): что будет в ячейках, то и увидите в выпадающем списке.

 

Sanja

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

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

#28

09.05.2016 19:51:11

Цитата
Юрий М написал: Не понимаю проблемы

Юрий М, я тоже не сразу воткнулся. Тут не все так просто. Диапазон не просто динамический. Проблема в том, что в Диапазон необходимо добавлять значение, если оно НЕ из Диапазона, но находится в ячейке на момент добавления в нее Проверки данных. А таким значением может быть число с десятичной запятой, которая Списком Проверки данных расценивается как разделитель списка. Теоретически таких РАЗНЫХ Списков может быть 31 (кол-во столбцов) * кол-во строк в таблице. Хотелось это обойти (назначение КАЖДОЙ ячейке СВОЕГО Списка (см. код в #19), но из-за запятой не выходит. С целыми числами проблем нет.
Как-то так  

Согласие есть продукт при полном непротивлении сторон.

 

Юрий М

Модератор

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

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

#29

09.05.2016 19:53:47

Цитата
Sanja написал:
если оно НЕ из Диапазона, но находится в ячейке

Вот это не могу переварить: если находится в ячейке диапазона, то уже в диапазоне ))
Может какой простенький пример? :-)

 

Sanja

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

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

#30

09.05.2016 20:16:23

Цитата
Юрий М написал: Может какой простенький пример? :-)

Так там-же в #19. Находиться не в ячейке Диапазона, а в ячейке, в которую Проверка вставляется. Т.е. на момент вставки ячейка НЕ пустая и вот это значение нужно добавить к Списку Проверки

Согласие есть продукт при полном непротивлении сторон.

Проверка переменных и выражений с помощью встроенных функций 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


19 / 19 / 0

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

Сообщений: 283

1

Проверка диапазона на наличие значений в каждой ячейке

24.12.2012, 17:56. Показов 20318. Ответов 6


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

Добрый день!

помогите пожалуйста с написанием макроса по следующему условию:

есть небольшая табличка.
наименование и несколько столбцов со значениями

как сделать так, чтобы проверялось значение каждой ячейки в диапазоне B:E по каждой строчке, и если хоть одна окажется пустой, ячейка 1ого столбца закрашивалась бы в красный цвет?

пример прилагаю



0



15136 / 6410 / 1730

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

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

24.12.2012, 19:55

2

Условное форматирование для всего первого столбца, формула

Код

=И(СЧЁТЗ(B1:E1)>0;СЧЁТЗ(B1:E1)<4)



1



toiai

3217 / 966 / 223

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

Сообщений: 2,085

24.12.2012, 19:58

3

Вот вариант макроса:

Visual Basic
1
2
3
4
5
6
Sub vRed()
    Dim s As Range
    For Each s In ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks)
        Cells(s.Row, 1).Interior.Color = vbRed
    Next
End Sub



1



caustic

19 / 19 / 0

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

Сообщений: 283

25.12.2012, 13:02

 [ТС]

4

Цитата
Сообщение от Казанский
Посмотреть сообщение

Условное форматирование для всего первого столбца, формула

макрос не пишется при применении данного правила условного форматирования

Цитата
Сообщение от toiai
Посмотреть сообщение

Вот вариант макроса:

а как сделать так, чтоб проверялись значения только больше нуля..

т.е. не

Visual Basic
1
For Each s In ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks)

а что-то наподобе, но не так коряво, как сделал это я:

Visual Basic
1
For Each s In ActiveSheet.UsedRange.Cells.Value > 0



0



3217 / 966 / 223

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

Сообщений: 2,085

25.12.2012, 16:52

5

Насмешил, пусто и больше нуля, определись ка!



0



19 / 19 / 0

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

Сообщений: 283

25.12.2012, 17:27

 [ТС]

6

Цитата
Сообщение от toiai
Посмотреть сообщение

Насмешил, пусто и больше нуля, определись ка!

как сделать так, чтобы учитывались значения только больше нуля..

Добавлено через 9 минут
по вашему представленному макросу, который помечает ячейки 1ого столба красным цветом, если на диапазоне есть пустые..

по той же самой технологии, но проверка значений по условию больше нуля:

если равно 0 или значение отрицательное (или пустая ячейка, что равносильно 0) — то ячейка закрашивалась бы красным



0



toiai

3217 / 966 / 223

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

Сообщений: 2,085

25.12.2012, 17:49

7

Тогда:

Visual Basic
1
2
3
4
5
6
7
8
Sub vRed()
    Dim s As Range
    For Each s In ActiveSheet.UsedRange
        If IsNumeric(s) Or IsEmpty(s) Then
            If s <= 0 Then Cells(s.Row, 1).Interior.Color = vbRed
        End If
    Next
End Sub

— условное форматирование надо убрать.



1



Ошибки пользователей при вводе данных – одна из самых распространенных проблем в ExcelВ результате ошибочных данных ячейки с формулами на разных листах друг за другом могут заполниться ошибками #ЗНАЧ, #H/Д и т.п. Поиск ошибок может занимать длительное время, потому что непонятен первоначальный источник ошибки. С чего начинать?  Но появление ячеек с ошибками это даже хорошо. 

Гораздо хуже, когда внешне все выглядит нормально, но при этом в данных есть ошибки. В таких случаях пользователь даже не догадываться о наличии ошибок и формирует недостоверные отчеты. А в результате принимаются ошибочные управленческие решения. Что же делать?

НЕДОСТАТКИ СТАНДАРТНЫХ ИНСТРУМЕНТОВ EXCEL

Как вы наверняка знаете, в Excel существует стандартный функционал для контроля вводимых в ячейки данных. Он устанавливается через меню Данные -> Проверка данных. В результате появляется диалоговое окно Проверка вводимых значений c тремя закладками.

На закладке Параметры в поле Тип данных можно выбрать тип данных. В зависимости от введенного типа становятся доступными для заполнения другие поля, например: 

  • для типа Число, Дата, Время можно задать границы – от и до и проверять на соблюдение условий между, меньше, больше и т.д.;
  • для типа Список можно задать список доступных значений;
  • для типа Другой можно задать свою собственную формулу, которая будет проверять вводимое значение на соблюдение каких либо условий, в том числе в зависимости от значений в других ячейках. 

На закладках Сообщение для ввода и Сообщение об ошибке можно задать текст соответствующего сообщения, чтобы подсказать пользователю в чем он ошибся.

Внешне сервис проверки данных кажется очень эффективным.  Особенно удобно  выбирать значение из выпадающего списка, а не вводить его вручную. Тем не менее стандартный функционал Excel позволяет решить проблему контроля вводимых данных лишь частично и у него есть существенные недостатки:

1. Стандартные средства контроля введенных данных могут создать у пользователя вредную иллюзию защищенности от ошибок. Особенно если данные вводили не вы, а кто-то другой, и вы рассчитываете что там все нормально, система отловила ошибки. Ведь проверка работает только при ручном вводе данных, но не работает при внесении данных другими способами! 

Например, если данные вводятся в ячейку с использованием команд Копировать->Вставить, Копировать->Специальная вставка-Значения или путем «растаскивания» от соседних ячеек, то проверка данных не осуществляется. Также значения в ячейках не контролируются, если они введены в ячейку с помощью макроса (если только контроль не осуществляется в самом макросе).

Таким образом, неверные данные могут попасть в ячейки, многократно тиражированы и Excel это не отследит! 

Часто это бывает, когда вы выгружаете данные в таблицы из других программ, например, 1С. Но особенно неприятно когда ошибки незаметны или малозаметны. Например:

  • Значение в ячейке выглядит как число и дата, а на самом деле оно является текстом. Например потому, что перед или после цифр есть пробел или другие непечатные (невидимые) символы.
  • Ячейка выглядит пустой, а на самом деле там есть непечатные символы.
  • В качестве разделителя целой и дробной части использована точка вместо запятой.
  • Введено значение, которое отсутствует в «привязанном» к ячейке выпадающем списке.

Последняя ситуация достаточно распространена. Например, вы ведете реестр платежей от контрагентов, и вводите наименование контрагентов с помощью выпадающего списка, связанного со справочником контрагентов. Спустя некоторое время вы обнаруживаете в наименовании контрагента ошибку и исправляете ее в справочнике. При этом Excel никак не отреагирует на то, что в реестре есть записи со старым (ошибочным) наименованием контрагента. То есть Excel при изменении элементов списка не отлавливает уже введенные данные типа «Список». 

2. Стандартные способы проверки могут «тормозить»

Достаточно распространенной проверкой является проверка для типа данных Другой с использованием формул. Это может быть проверка на непревышение планового бюджета по статьям расходов, проверка на уникальность элемента списка и т.п. 

В этом случае часто используются «тяжелые» функции СЧЕТЕСЛИ, СЧЕТЕСЛИМН, которые подсчитывают количество или сумму по уже введенным ранее данным и сравнивают, не превысит ли вводимое значение какой-то предел.
Всякий раз, когда вы вводите или изменяете значение в ячейке, отрабатывает эта «тяжелая» формула. Если при этом с ячейкой связано много других ячеек, будут пересчитываться и они. Когда вы это делаете и тестируете в таблицах мало данных и задержек не ощущается.

Но по мере роста таблиц Excel может начать «залипать» при вводе данных, иначе говоря не успевать за руками пользователя. И это очень раздражает.
Поэтому, использовать проверку вводимых данных с использованием типа Другой и «тяжелыми» формулами нужно очень обдуманно. Я советую вообще исключить использование подобных приемов.

 3. Бесполезный инструмент «Обвести неверные данные»

Для проверки правильности введенных значений в Excel есть встроенный инструмент «Обвести неверные данные», который вызывается через пункты меню — Данные -> Проверка данных -> Обвести неверные данные.

Команда доступна только на незащищенном листе, а результатом ее работы будет обведение неверных по мнению Excel данных красным овалом как на рисунке выше. 

На мой взгляд, это функция практически бесполезна по трем причинам: 

  • Будут признаны ошибочными и обведены пустые ячейки с типом «Список допустимых значение», если для них при настройке была снята галочка в поле «игнорировать пустые ячейки» (она снята в большинстве случаев). Но согласитесь — неверные значения и пустые значения это разные вещи. 
  • Помечаются только первые 255 недопустимых значения.
    Если в вашей таблице десятки колонок и тысячи строк, то придется много раз повторять одни и те же действия – исправлять ошибки и снова запускать обводку неверных данных. 
  • Она не всегда работает корректно. На вышеприведенном рисунке не были обведены значения в колонке ЦУ  — Объект «Сколково» — хотя эти значения ошибочные, т.к. их нет в списке. 

4. «Подсвечивание» ячеек с ошибочными данными

Еще одним распространенным способом проверки наличия неверных данных является выделение ячеек, в которых обнаружены некорректные данные, ярким цветом фона или шрифта с помощью условного форматирования

Я считаю это способ неэффективным. Ну  «подсветили» вы некорректные данные в таблице, а что дальше? 

Если таблице тысячи строк, то либо придется прокручивать всю таблицу в поисках подсвеченных ячеек, либо применять автофильтр по цвету. Причем поочередно делать для каждого столбца, так как непонятно – есть там неверные данные или нет. 

Это очень трудоемко. Поэтому, пользователи начинают добавляют к своей таблице макросы, которые позволяют подсчитывать количество ячеек по цвету фона или шрифта. Такие макросы можно без проблем найти в интернете, но дело не в этом.  

Мало того, что из-за правил условного форматирования Excel будет «тормозить», так пользователи еще и усложняют систему совсем необязательными макросами. 

КАК ПРАВИЛЬНО ОРГАНИЗОВАТЬ ПРОВЕРКУ ВВЕДЕННЫХ ДАННЫХ

В своих решениях я перепробовал несколько вариантов и остановился на мой взгляд может быть не самый эстетичный, зато самый надежный и эффективный. 

Этот способ может быть дополнением к стандартному функционалу проверки вводимых данных, или применяться самостоятельно. Суть способа в следующем. 

Любую проверку вводимых значений можно делать и обычными функциями Excel, такими как ЕСЛИ, ЕТЕКСТ, ЕНЕТЕКСТ, ЕЧИСЛО, ПОИСКПОЗ. Поэтому в таблице можно создать служебную колонку  в ячейках которой задать формулу, которая будет проверять корректность введенных данных по заданным условиям во всех ячейках строки, предназначенных для ввода и сообщать об этом пользователю. Расчет формулы сделать включаемым/ выключаемым в зависимости от положения «тумблера». Что такое тумблеры и зачем они, написано здесь.

Это не предотвратит некорректный ввод данных, но предупредит об этом пользователя.
Зато формула будет отрабатывать не при ручном вводе данных, а по вашему требованию. 
Таким образом, пользователь может свободно вводить данные и Excel не будет «тормозить». Перед формированием управленческих отчетов пользователь запускает проверку, выявляет все ошибки и исправляет их. 

Как это устроено проще всего понять это на примере (см. рисунок ниже) 

1. В шапке таблицы создается служебная строка, каждая ячейка которой содержит формулу =Столбец (). Теперь у пользователя всегда перед глазами есть порядковые номера столбцов. Причем, что бы вы ни сделали со столбцами (вставка, удаление, перемещение) нумерация всегда будет сохраняться. 

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

Формула состоит из блоков функций, соединенных между собой амперсандом для сцепки текста в единую строку. Каждый блок проверяет одну ячейку в строке и если значение ошибочное возвращает номер колонки, а если верное не возвращает ничего. 

Блоки могут быть такие:

  • Ячейки, в которых должна вводиться дата или число проверяется такой конструкцией

ЕСЛИ(ЕТЕКСТ(проверяемое_значение);номер_столбца&».»;»») 

  • Ячейки, в которых значение вводится из выпадающего списка проверяется такой конструкцией: 

EСЛИ(ЕСЛИОШИБКА(ПОИСКПОЗ(искомое_значение; просматриваемый_массив;0);-1)>0;””;номер_столбца) 

  • Если вам нужно проверять даты на вхождение в определенный период времени используйте обычные функции ЕСЛИ, >=,<= и т.д. Аналогично для чисел. 

Не забудьте всю эту конструкцию поместить внутрь функции ЕСЛИ:     =ЕСЛИ(НаТ1;ваша_цепочка_блоков;””), где НаТ1 это имя ячейки-тумблера, которая включает/выключает расчет формулы.  Это позволит не вычислять формулу при всяком изменении в ячейках, а делать это по необходимости. 

В результате в служебной колонке, в тех строках, где будут обнаружены ошибки, отобразятся номера колонок с некорректными данными, разделенные точками. В шапке таблицы можно подсчитать количество строк с ошибками следующей формулой:
=ЧСТРОК(A$5:A$677)-СЧЁТЕСЛИ(A$5:A$677;»») , где A$5:A$677 – диапазон служебного столбца в котором выводятся признаки ошибок. 

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

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

Все просто и удобно, никаких «тормозов» и экономия времени!

Cookie-файлы

Настройка cookie-файлов

Детальная информация о целях обработки данных и поставщиках, которые мы используем на наших сайтах

Аналитические Cookie-файлы
Отключить все

Мы используем файлы Cookie для улучшения работы, персонализации и повышения удобства пользования нашим сайтом. Продолжая посещать сайт, вы соглашаетесь на использование нами файлов Cookie.
Подробнее о нашей политике в отношении Cookie.


Подробнее


Понятно

Создать цикл, который проверяет значение в ячейке

S0LDAT

Дата: Вторник, 03.02.2015, 03:58 |
Сообщение № 1

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

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

Сообщений: 19


Репутация:

0

±

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


Excel 2007

Добрый день.
Есть код, проверяет, есть ли слово «ОШИБКА!» в ячейке и если есть, выводит сообщение в TextBox. Но дело в том, что у меня в столбце «Y» есть 130 строк, надо проверить их все.

[vba]

Код

Private Sub TextBox21_Change()
If CStr(Лист1.Range(«Y2»).Value) = «ОШИБКА!» Then
Me.TextBox21.Text = «Ошибка заполнения сумм в строке 2»
Else
Me.TextBox21.Text = «Ошибок нет»
End If
End Sub

[/vba]

Спасибо.

 

Ответить

Michael_S

Дата: Вторник, 03.02.2015, 04:31 |
Сообщение № 2

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

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

Сообщений: 2012


Репутация:

373

±

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


Excel2016

вероятно как-то так….
[vba]

Код

Private Sub TextBox21_Change()
dim arr(), c, i&
with worksheets(«Лист1»)
          arr=intersect(.usedrange, .range(«y:y»)).value
end with
Me.TextBox21.Text=»»
for i=1 to ubound(arr)
       If arr(i,1) = «ОШИБКА!» Then
            Me.TextBox21.Text = Me.TextBox21.Text  & «Ошибка заполнения сумм в строке » & i & chr(10)
        end if
next
if Me.TextBox21.Text=»» then
       Me.TextBox21.Text = «Ошибок нет»
End If
End Sub

[/vba]

 

Ответить

_Boroda_

Дата: Вторник, 03.02.2015, 09:41 |
Сообщение № 3

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

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


2003; 2007; 2010; 2013 RUS

Сергей, а Вам действительно нужно на каждую ошибку выводить сообщение с номером строки? А если их 100 штук будет?
Может, проще одно сообщение? А уж на 130 строк можно потом и ручками поискать. Кстати, сделайте туда условное форматирование (например, красная заливка), чтобы быстрее искать было.
[vba]

Код

Private Sub TextBox21_Change()
       r1_ = Лист1.Range(«Y» & Rows.Count).End(xlUp).Row
       If r1_ < 2 Then Exit Sub
       On Error Resume Next
       n_ = WorksheetFunction.Match(«ОШИБКА!», Range(«Y2:Y» & r1_), 0)
       If Err.Number = 0 Then
           Me.TextBox21.Text = «Есть ошибка заполнения сумм»
       Else
           Me.TextBox21.Text = «Ошибок нет»
       End If
End Sub

[/vba]
[moder]В следующий раз обязательно прикладывайте свой файл. Иначе будет замечание.


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

Сообщение отредактировал _Boroda_Вторник, 03.02.2015, 09:44

 

Ответить

S0LDAT

Дата: Вторник, 03.02.2015, 09:55 |
Сообщение № 4

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

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

Сообщений: 19


Репутация:

0

±

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


Excel 2007

Спасибо, а я тут методом тыка навоял

[vba]

Код

Private Sub TextBox21_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Static b As Long
Dim i, c As Integer
b = 2
TextBox21.Visible = True
TextBox21.MultiLine = True

Me.TextBox21.Text = «Кликните два раза мышкой, чтобы проверить ошибки»
For i = 2 To 131
    If Range(«Y» & i) = «ОШИБКА!» Then

             Me.TextBox21.Text = «Ошибка заполнения сумм в строке: » & i & vbCr & CStr(Лист1.Range(«A» & i).Value)
          b = b + 1
     End If
   Next i

           If Me.TextBox21.Text = «Кликните два раза мышкой, чтобы проверить ошибки» Then
Me.TextBox21.Text = «Ошибок не обнаружено»
End If
End Sub
End Sub

[/vba]

а как все это дело запустить по нажатию кнопки?
[moder]Я предупреждал. Ловите замечание.

 

Ответить

S0LDAT

Дата: Вторник, 03.02.2015, 10:03 |
Сообщение № 5

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

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

Сообщений: 19


Репутация:

0

±

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


Excel 2007

Страницу не обновлял долго, вот и не видел сообщения (
вот файл

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

0001.xlsm
(21.5 Kb)

Сообщение отредактировал S0LDATВторник, 03.02.2015, 10:07

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Макрос для вставки фото в excel
  • Макрос для поиска файлов в excel
  • Макрос для вставки текста в excel
  • Макрос для поиска по слову excel
  • Макрос для вставки строк в excel