Макрос проверки данных excel

Ошибки пользователей при вводе данных – одна из самых распространенных проблем в 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.


Подробнее


Понятно

 

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 that checks if a cell is in a range, named range, or any kind of range, in Excel.

ab8ca0d4d1e3775d79e3940a9f28a0cf.jpg

Sections:

Check if Cell is in a Range Macro

Check if Cell is in a Named Range

Notes

Check if Cell is in a Range Macro

Sub CellinRange()

'######################################'
'#########   TeachExcel.com   #########'
'######################################'

'Tests if a Cell is within a specific range.

Dim testRange As Range
Dim myRange As Range

'Set the range
Set testRange = Range("B3:D6")

'Get the cell or range that the user selected
Set myRange = Selection

'Check if the selection is inside the range.
If Intersect(testRange, myRange) Is Nothing Then
    'Selection is NOT inside the range.

    MsgBox "Selection is outside the test range."

Else
    'Selection IS inside the range.

    MsgBox "Selection is inside the test range."

End If

End Sub

How to Use the Macro

B3:D6 change this to the range that you want to check to see if the cell is within it.

Selection keep this the same to use the currently selected cell or range from the user or change it to a regular hard-coded range reference like Range(«A1») or whatever range you want.

‘Selection is NOT inside the range. under this line, put the code that you want to run when the cell is not within the range.

‘Selection IS inside the range. under this line, put the code that you want to run when the cell is within the range.

How Does the Macro Know if the Cell is in the Range?

Intersect(testRange, myRange) this checks if the range within the myRange variable overlaps or intersects with the range in the testRange variable. This function, the Intersect function, will return a range object where the two ranges overlap, or, if they don’t overlap, it will return nothing.

As such, we can use the IF statement to check if nothing was returned or not and we do that using Is Nothing after the Intersect function. The Is Nothing is what checks if the Intersect function returned nothing or not, which evaluates to TRUE or FALSE, which is then used by the IF statement to complete its logic and run.

This is how we get the full first line of the IF statement, and this is where all the magic happens:

If Intersect(testRange, myRange) Is Nothing Then

The rest of the IF statement is just a regular IF statement in VBA, with a section of code that runs if the cell is within the range and one that runs when the cell is outside of the range.

Check if Cell is in a Named Range

This is almost exactly the same as the previous macro except that we need to change the range reference from B3:D6 to the name of the named range; that’s it.

It could look like this:

Sub CellinRange()

'######################################'
'#########   TeachExcel.com   #########'
'######################################'

'Tests if a Cell is within a specific range.

Dim testRange As Range
Dim myRange As Range

'Set the range
Set testRange = Range("MyNamedRange")

'Get the cell or range that the user selected
Set myRange = Selection

'Check if the selection is inside the range.
If Intersect(testRange, myRange) Is Nothing Then
    'Selection is NOT inside the range.

    MsgBox "Selection is outside the test range."

Else
    'Selection IS inside the range.

    MsgBox "Selection is inside the test range."

End If

End Sub

For a more detailed expanation of how this macro works, look to the section above.

Notes

If the user makes a selection of multiple cells or a range, and any of those cells are within the test range, this macro will run the code for when the selection is inside the range.

Testing if a range is within a range simply uses the Intersect function in Excel VBA; however, due to how it works, it can seem confusing since we have to check if it Is Nothing or not. But, once you get used to writing this and seeing this in IF statements, it’s really not that difficult, just remember that, in this instance, you will want to pair the use of Intersect with Is Nothing and everything else should follow quite easily.

Download the sample file to get the macro in Excel.

Similar Content on TeachExcel

Excel Data Validation — Limit What a User Can Enter into a Cell

Tutorial:
Data Validation is a tool in Excel that you can use to limit what a user can enter into a…

Logical Operators in Excel VBA Macros

Tutorial: Logical operators in VBA allow you to make decisions when certain conditions are met.
They…

Make a UserForm in Excel

Tutorial: Let’s create a working UserForm in Excel.
This is a step-by-step tutorial that shows you e…

Sum Values that Equal 1 of Many Conditions across Multiple Columns in Excel

Tutorial:
How to Sum values using an OR condition across multiple columns, including using OR with …

VBA Comparison Operators

Tutorial: VBA comparison operators are used to compare values in VBA and Macros for Excel.
List of V…

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

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