Проблемы с использованием оператора «IF» и пустых ячеек при проверке данных - PullRequest
0 голосов
/ 10 января 2019

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

Я работаю над интерактивной формой, которая будет использоваться на работе, где есть раскрывающееся меню (A1) для семейства продуктов, а затем выбор там вызывает второе раскрывающееся меню (A2), в котором отображаются продукты данного семейства. .

Для этого мы использовали три таблицы (с фиктивными данными): ProductFamily (фрукты и овощи) Фрукты (столбец 1 содержит список фруктов, а столбец 2 содержит цены) Овощи (в столбце 1 указан список овощей, а в столбце 2 указана цена).

Мой коллега и я пытались разорвать форму, и мы обнаружили, что если в A1 не выбрана ни одна ProductFamily, мы можем набрать в A2 все, что захотим, без ошибки проверки, а после этого мы можем даже выбрать Product Семья и это все еще не вызывает проблемы в нашем нестандартном вводе.

Чтобы попытаться противостоять этому, я создал четвертую таблицу, которую я назвал Null. В нем была только одна клетка, и это было ="".

Чтобы проверить это, я установил для параметра Проверка данных значение Список с источником =INDIRECT(IF(ISBLANK(A1),"Null","Fruit[Column1]")). С этим я обнаружил, что я все еще мог печатать в A2, если A1 был пуст, но если A1 не был пустым, я не мог печатать. Я поменял позиции так, что формула была: =INDIRECT(IF(ISBLANK(A1),"Fruit[Column1]","Null")) и обнаружил, что хотя я мог видеть список фруктов, когда A1 был пуст, я все еще мог печатать все, что хотел. когда A1 не был пустым, у меня была только опция "", и все, что я набирал, вызывало ошибку.

Примечание: я попробовал и синтаксис =INDIRECT(IF(condition,"True","False"), и синтаксис =IF(condition,INDIRECT("True"),INDIRECT("False") и не обнаружил (как и ожидалось) никаких различий в поведении.

Я не знаю, почему часть True в выражении IF ведет себя так, но я наконец попытался, =INDIRECT(IF(ISBLANK(A1),IF(ISBLANK(A1)=FALSE,,"Null"),"Fruit[Column1]")) и обнаружил, что принудительное включение "Null" в ложное условие заставило его работать так, что если я набрал что-нибудь в A2, когда A1 было пустым, он выдал ошибку.

Для финальной версии это было

=INDIRECT(IF(ISBLANK(A1),IF(ISBLANK(A1)=FALSE,,"Null"),A1 & "[Column1]"))

Неужели нет другого способа сделать это, кроме как копаться в VBA?

1 Ответ

0 голосов
/ 10 января 2019

Пробелы в валидации могут быть немного непостоянными. Пробелы в динамической проверке тем более.

Кажется, что опция «Игнорировать пропуски» в диалоговом окне «Проверка данных» применяется не только к полю, к которому применяется проверка, но также к полям источника, используемым при вычислении проверки. В вашем случае вы сможете использовать одну из более простых и интуитивно понятных формул валидации, если просто снимите флажок «Игнорировать пропуски».

В моем примере я назвал одну пустую ячейку «Пустой», чтобы упростить формулу проверки:

=IF(A1="",Blank,INDIRECT("Fruit[Column1]"))

Теперь вы получаете сообщение об ошибке, если вы пытаетесь что-то ввести в A2, если A1 пусто.

(Это создает небольшую проблему, из-за которой вы не можете очистить A2, находясь в режиме редактирования, то есть вы не можете войти в режим редактирования, удалить весь текст и затем нажать клавишу ввода для подтверждения. Вам нужно выйти из ячейки, а затем нажмите «Удалить», чтобы очистить все содержимое, что позволяет обойти проверку, не допускающую пропусков.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...