Ronin751 Пользователь Сообщений: 924 |
Доброго времени суток уважаемые жители планеты! тут ) немного условия поменялись, но проблема та же. |
Пытливый Пользователь Сообщений: 4587 |
Здравствуйте. Кому решение нужно — тот пример и рисует. |
Ronin751 Пользователь Сообщений: 924 |
#3 06.05.2016 13:36:08 Здравствуйте Пытливый! Спасибо, что обратили внимание на тему.
Это же я для образца, сделал. Весь файл очень большой. Вот я только проблемный участок и показал. В реальном файле дело идет так: пользователь, в UserForm отбирает нужные позиции, их количество и подчиненность, нажимает ОК и макрос составляет полную таблицу начальных данных ( если хотите, назовем её неким ГРАФИКОМ или ПЛАНОМ ). Как только таблица составлена, макрос выставляет проверку. А далее пользователь редактирует данные в таблице. |
||
Пытливый Пользователь Сообщений: 4587 |
#4 06.05.2016 13:47:34 Ну… тогда у вас уже все сделано, т.е. надо определить конкретную ячейку, для которой стараемся (у вас в коде это все для АсtiveCell).
Потом выделил В2, запустил — все гуд. Кому решение нужно — тот пример и рисует. |
||
Ronin751 Пользователь Сообщений: 924 |
Да! Ваш пример только на случай замены цифр на букву. Но если пользователь изменил цифру на букву, а через время снова захотел поставить прежнюю цифру, то столкнется с ошибкой. Вот по этому, в примере я использовал другую формулу. Задача составить проверку, которая будет позволять наличие только букв из именованного диапазона или исходной цифры. Изменено: Ronin751 — 06.05.2016 14:01:11 |
Пытливый Пользователь Сообщений: 4587 |
#6 06.05.2016 13:57:27 Ну добавьте в именованный список значение изначальное и все…
Изменено: Пытливый — 06.05.2016 14:14:21 Кому решение нужно — тот пример и рисует. |
||
Ronin751 Пользователь Сообщений: 924 |
#7 06.05.2016 14:05:18
С радостью, но я их сам не знаю. Их рассчитывает макрос. Да и если представить, что в именованом диапазоне будут допустим еще и 5,6,8,9… То, что в этом случае будет мешать пользователю изменить изначальную 9 на 5?! |
||
Sanja Пользователь Сообщений: 14838 |
#8 06.05.2016 14:21:41
Такое не то что макросу не объяснить, тут и человеку-то надо столько выпить, что бы понять… Согласие есть продукт при полном непротивлении сторон. |
||
Пытливый Пользователь Сообщений: 4587 |
Развивая мысль ув.Sanja, по событию Change Ничего не забыл? Кому решение нужно — тот пример и рисует. |
Sanja Пользователь Сообщений: 14838 |
#10 06.05.2016 14:46:38 «Растекаемся» мыслью дальше
не обязательно. Проверка данных принимает в качестве Списка строку, которую можно формировать прямо в коде, изначально, без ссылок на диапазоны
Изменено: Sanja — 06.05.2016 14:51:52 Согласие есть продукт при полном непротивлении сторон. |
||||
Ronin751 Пользователь Сообщений: 924 |
#11 06.05.2016 15:56:00
С помощью макроса составляется таблица и заносятся начальные данные. Следующий ход макроса — установить проверку эти ячейки. Условием для устанавки проверки является: если в ячейке текст -значит, при редактировании этой ячейки, допускаются только буквенные значения из именованного диапазона (на листе2); если в ячейке число(допустим 7) — то, при редактировании этой ячейки, допускаются только буквенные значения из именованного диапазона (на лист2) и это число (то есть 7). Фух! Вроде так. Прикрепленные файлы
|
||
Sanja Пользователь Сообщений: 14838 |
#12 06.05.2016 16:13:39 ?
Согласие есть продукт при полном непротивлении сторон. |
||
Ronin751 Пользователь Сообщений: 924 |
#13 06.05.2016 17:35:31 Вроде и проверку выполнило но…
В ячейках, где числовое значение записано через запятую, эту самую запятую превращаем в точку. Только проблема возникает при попытке изменить, допустим 4,5 на 4.5. Все равно пишет, что значение не допустимое. И сумма получается уже другая. |
||
Sanja Пользователь Сообщений: 14838 |
Да, я это тоже заметил. Если в строку для Проверки вставлять числа с запятой, то Список их разбивает на два значения. Этот пример больше как направление для дальнейшего движения. Согласие есть продукт при полном непротивлении сторон. |
Ronin751 Пользователь Сообщений: 924 |
Я это тоже делал, только немного иначе. Сейчас думаю как число с запятой загнать в кавычки (как текст). Тогда проверка, по идее, должна воспринять его. |
Sanja Пользователь Сообщений: 14838 |
Можно вернуться к схеме, которую предложил Пытливый, Добавлять значение к диапазону и в Проверку вставлять ссылку на него Согласие есть продукт при полном непротивлении сторон. |
Sanja Пользователь Сообщений: 14838 |
#17 07.05.2016 09:02:38 Проверил на практике идею Пытливый,
т.к. всем ячейкам назначается диапазон с одним и тем-же именем (хоть его содержимое и меняется от ячейки к ячейке), то, в итоге, для всех ячеек будет назначен диапазон со значениями для последней ячейки, что логично. Согласие есть продукт при полном непротивлении сторон. |
||
Ronin751 Пользователь Сообщений: 924 |
#18 07.05.2016 13:30:45 Именно об этом я говорил в посте № 7
И с кавычками у меня не получается. Эксель все равно интерпретирует число с запятой, как два разных. ((( |
||
Sanja Пользователь Сообщений: 14838 |
#19 07.05.2016 13:44:52
Нет, мы говорим про разные вещи. Но все равно решения нет. Пока Или может какое другое решение будет?
Прикрепленные файлы
Изменено: Sanja — 07.05.2016 13:51:14 Согласие есть продукт при полном непротивлении сторон. |
||||
Ronin751 Пользователь Сообщений: 924 |
Вообще, конечно странно… Но видимо приходится констатировать тот факт, что любое (даже текстовое значение) которое записано через запятую в ячейке, с помощью ВБА не возможно добавить в стандартную проверку. Просто потому, что эксель, в этом случае, не воспринимает запятую как десятичный разделитель, а упорно думает, что это перечисление последовательных (или не последовательных) пунктов. |
JeyCi Пользователь Сообщений: 3357 |
#21 08.05.2016 15:18:54
мне кажется не xl, а vba
а тут не vba, а xl Изменено: JeyCi — 08.05.2016 15:19:39 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||
Ronin751 Пользователь Сообщений: 924 |
Как то странно получается не правда ли? Эксель не понимает ВБА. хм-м. |
JeyCi Пользователь Сообщений: 3357 |
#23 08.05.2016 16:28:15
расхождения бывают в рус.яз xl (именно по трактовке запятой и точки-с-запятой в формулах, а также десятичного разделителя) Изменено: JeyCi — 08.05.2016 16:30:52 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Ronin751 Пользователь Сообщений: 924 |
Поскольку при попытке создать проверку макросом эксель не воспринимает запятую как десятичный разделитель, решил пойти нахрапом: сменил десятичный разделитель с запятой на точку (меню пуск — панель управления — пункт «Языки и региональные стандарты»). Но эффект тот же (даже если формат ячейки перевести в текстовый). Получается, что с помощью ВБА вообще не возможно передать в проверку значение с любым разделителем?! И это очень прискорбно. |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Вариант: создать именованный динамический (если размер меняется) диапазон и его скармливать Проверке данных. |
Ronin751 Пользователь Сообщений: 924 |
#26 09.05.2016 18:28:00
Если я правильно понимаю, то в этом случае придется добавлять новые значения (с разделителями) в именованный динамический диапазон и в итоге все эти значения будут доступны для каждой ячейки. Но этот вариант не подходит, так как необходимо чтоб список проверки был наполнен значениями (буквенными) из именованного списка и значением самой ячейки ( к примеру «3,5»). Или можно как то это менять? |
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Не понимаю проблемы (вопроса): что будет в ячейках, то и увидите в выпадающем списке. |
Sanja Пользователь Сообщений: 14838 |
#28 09.05.2016 19:51:11
Юрий М, я тоже не сразу воткнулся. Тут не все так просто. Диапазон не просто динамический. Проблема в том, что в Диапазон необходимо добавлять значение, если оно НЕ из Диапазона, но находится в ячейке на момент добавления в нее Проверки данных. А таким значением может быть число с десятичной запятой, которая Списком Проверки данных расценивается как разделитель списка. Теоретически таких РАЗНЫХ Списков может быть 31 (кол-во столбцов) * кол-во строк в таблице. Хотелось это обойти (назначение КАЖДОЙ ячейке СВОЕГО Списка (см. код в #19), но из-за запятой не выходит. С целыми числами проблем нет. Согласие есть продукт при полном непротивлении сторон. |
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#29 09.05.2016 19:53:47
Вот это не могу переварить: если находится в ячейке диапазона, то уже в диапазоне )) |
||
Sanja Пользователь Сообщений: 14838 |
#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 |
|||
Вот вариант макроса:
1 |
caustic 19 / 19 / 0 Регистрация: 30.09.2011 Сообщений: 283 |
||||||||
25.12.2012, 13:02 [ТС] |
4 |
|||||||
Условное форматирование для всего первого столбца, формула макрос не пишется при применении данного правила условного форматирования
Вот вариант макроса: а как сделать так, чтоб проверялись значения только больше нуля.. т.е. не
а что-то наподобе, но не так коряво, как сделал это я:
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 |
Насмешил, пусто и больше нуля, определись ка! как сделать так, чтобы учитывались значения только больше нуля.. Добавлено через 9 минут по той же самой технологии, но проверка значений по условию больше нуля: если равно 0 или значение отрицательное (или пустая ячейка, что равносильно 0) — то ячейка закрашивалась бы красным
0 |
toiai 3217 / 966 / 223 Регистрация: 29.05.2010 Сообщений: 2,085 |
||||
25.12.2012, 17:49 |
7 |
|||
Тогда:
— условное форматирование надо убрать.
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.
Подробнее
Понятно
Создать цикл, который проверяет значение в ячейке |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |