Страницы: 1
RSS
Как сделать проверку содержание в ячейке строковых кодов только из заданного массива?
 
Ячейка содержит пары строковой код (длина 1 - 2 символа) и числовое значение. Строковой код и числовое значение разделены пробелом. Разделение пар - перевод строки.
Есть список допустимых строковых кодов (всего их 6).
Необходимо блокировать ввод в ячейку любых других строковых кодов.
Реализацию вижу через использование объекта "проверка данных" поскольку сборка ексель файла осуществляется через автоматизацию (не вручную). Т.е. нужна формула для проверки ячейки. Например если бы мы хотели исключить ввод заранее известных значений, можно было бы использовать такую формулу: =ЕСЛИ(ЕЧИСЛО(ПОИСК(""от"";RC));ЛОЖЬ;ИСТИНА)
 
Цитата
Userdo написал:
Реализацию вижу через использование объекта "проверка данных" поскольку сборка ексель файла осуществляется через автоматизацию (не вручную).
Наоборот, проверка данных работает только для ввода вручную, а через автоматизацию в ячейку с проверкой данных можно ввести все что угодно.
Почему бы не добавить контроль вводимых данных в автоматизацию?
Изменено: Казанский - 04.07.2018 09:59:47
 
Цитата
Userdo написал:
Реализацию вижу через использование объекта "проверка данных"
Это хорошо, но еще лучше если мы увидим пример.
По вопросам из тем форума, личку не читаю.
 
Сборка ексель файла осуществляется не вручную, а через автоматизацию и рассылается пользователям для заполнения интерактивно аля вручную.
Вообще, возможно ли сделать такую проверку через формулу?
Изменено: Userdo - 04.07.2018 10:15:32
 
Решения как я понимаю нет через определение массива возможных значений, поскольку нет возможности проверки содержимого ячейки на то, что неопределено.
Но, допустим если бы мы знали список того, что там быть не должно, то тоже непонятно как такую формулу написать, Например, для проверки содержимого ячейки из предыдущего столбца на значения из массива из четырех элементов "от";"кл";"лол";"тест" можно было бы использовать следующую формулу для проверки (возвращает ложь если пользователь ввел недопустимое значение)
Код
=  0 = --ЕЧИСЛО(ПОИСК("от";RC[-1]))+ --ЕЧИСЛО(ПОИСК("кг";RC[-1]))+ --ЕЧИСЛО(ПОИСК("лол";RC[-1]))+ --ЕЧИСЛО(ПОИСК("тест";RC[-1]))

а если бы нам требовалось проверить массив из 20ти, такую формулу было бы просто невозможно написать поскольку существует ограничение на длину формулы в 255 символов которую можно присвоить ячейке через автоматизацию.
С другой стороны из условий задачи массив того, что там быть может состоит всего из 6 элементов.
Так же можно было бы зайти для решения со стороны макросов - там нет ограничений на длину процедуры, но как гарантировать, что пользователь не отключит исполнение макросов и проверку таким образом мне не понятно..
Изменено: Userdo - 05.07.2018 15:53:33
 
Чем не устроили варианты в прошлой теме
Лень двигатель прогресса, доказано!!!
 
тем, что ищут только по первому элементу массива
 
Цитата
Userdo написал:
ищут только по первому элементу массива
Это не правда. Все ищется по нескольким значениям. А вот дубль темы - это уже очень нехорошо.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Да по той теме уже разобрались. Здесь же вопрос в другом: Если мы знаем то, что там может быть тогда как понять, что там есть что-то еще.
Например, содержимое ячейки "яблоки 10ПСГруши 5ПСАрбузы 8ПСДыни 10" если список допустимого {"Груши";"Арбузы"},
тогда что-то еще будет "Дыни".

Пример добавлен, но поскольку в нем нет формулы он не сильно отличается от пустого файла. Единственное отличие на R1C1 внесено значение и добавлен объект проверка данных с истиной вместо формулы которую требуется разработать в соотв. с текущим топиком.
Изменено: Userdo - 05.07.2018 15:29:02
 
Цитата
Userdo написал: Например, содержимое ячейки "яблоки 10ПСГруши 5ПСАрбузы 8ПСДыни 10" если список допустимого {"Груши";"Арбузы"},тогда что-то еще будет "Дыни".
Прочитал...Долго думал...ЧТО должно быть на выходе? Результат работы формулы покажите в файле
Согласие есть продукт при полном непротивлении сторон
 
формула должна возвращать истину если значение введено корректно, иначе ложь (объект "проверка данных")
Изменено: Userdo - 05.07.2018 15:38:54
 
А где в файле список допустимых значений?
Согласие есть продукт при полном непротивлении сторон
 
список необходимо задать в теле формулы. Например, в форме массива {"Яблоки":"Груши":"Арбузы"}
Изменено: Userdo - 05.07.2018 15:54:42
 
Формула массива
=И(ЕЧИСЛО(ПОИСК({"яблоки":"Груши":"Арбузы":"Дыни"};A1)))
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Bema, ошиблись на нашем примере "Дыни" это что-то еще. Не входит оно в список допустимого.
Изменено: Userdo - 05.07.2018 15:54:29
 
смотрим привязка на перенос подразумевается что в ячейке только уникальные названия продуктов
Код
=ЕСЛИ(ДЛСТР(A1)+1-ДЛСТР(ПОДСТАВИТЬ(A1;СИМВОЛ(10);""))-СУММПРОИЗВ(--ЕЧИСЛО(ПОИСК({"груши":"арбузы"};A1)));"есть паразиты";"норма")
Лень двигатель прогресса, доказано!!!
 
не получается вставить данную формулу в поле для формулы проверки данных
 
каким боком тут проверка данных она проверяет содержимое ячейки на ввод это совсем другая песня
Лень двигатель прогресса, доказано!!!
 
Читаем первый пост и понимаем собственно зачем нам формула
 
Вердикт таков: поскольку формулы массива использовать в проверке данных нельзя понимаем что задача не реализуема. Не выходит каменный цветок((
 
если поднапрячься то выйдет, дополните через перенос любым текстом или введите заново в желтой ячейке
Лень двигатель прогресса, доказано!!!
 
Забавно, но цветок вышел. Спасибо.
 
Сергей,  Арбузыыыыыы

наверно надо =NOT(LEN(Лист1!$E1)+1-LEN(SUBSTITUTE(Лист1!$E1;CHAR(10);""))-SUMPRODUCT(--ISNUMBER(SEARCH({"груши";"арбузы"}&" ";Лист1!$E1))))
Изменено: БМВ - 05.07.2018 16:52:44
По вопросам из тем форума, личку не читаю.
 
Как выяснилось, предложенная формула не всегда дает верный результат:

=НЕ(ДЛСТР(TDSheet!RC)+1-ДЛСТР(ПОДСТАВИТЬ(TDSheet!RC;СИМВОЛ(10);""))-СУММПРОИЗВ(--ЕЧИСЛО(ПОИСК({"я":"н":"рв":"лч":"в":"нн"};TDSheet!RC))))

например "РВ 8" даст ЛОЖЬ, поскольку суммпроизв вернет 2 вместо 1

Очевидно, чтобы решить задачу нужно искать не по всей ячейке, а в пределах одной строки (до СИМВОЛ(10))
Изменено: Userdo - 11.07.2018 09:22:25
 
Как выяснилось, предложенная формула не всегда дает верный результат:

=НЕ(ДЛСТР(TDSheet!RC)+1-ДЛСТР(ПОДСТАВИТЬ(TDSheet!RC;СИМВОЛ(10);""))-СУММПРОИЗВ(--ЕЧИСЛО(ПОИСК({"я":"н":"рв":"лч":"в":"нн"};TDSheet!RC))))

например "РВ 8" даст ЛОЖЬ, поскольку суммпроизв вернет 2 вместо 1

Очевидно, чтобы решить задачу нужно искать не по всей ячейке, а в пределах одной строки (до СИМВОЛ(10))
 
Окончательное решение
=НЕ(ДЛСТР(RC)+1-ДЛСТР(ПОДСТАВИТЬ(RC;СИМВОЛ(10);""))-СУММПРОИЗВ(--ЕЧИСЛО(ПОИСК({"я":"н":"х":"лч ":"в":"нн"};ПОДСТАВИТЬ(СТРОЧН(RC);"рв";"х")))))
Изменено: Userdo - 12.07.2018 08:59:54
Страницы: 1
Наверх