Excel 2013: использование косвенного в предложении оператора If для списка проверки данных

#excel #vba

#excel #vba

Вопрос:

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

Я работаю со списком интерфейсов (столбец D) для router1, используя:

 =INDIRECT("TBL_Device_Interfaces[" amp; INDIRECT("B" amp; ROW()) amp; "]")
  

Здесь я сталкиваюсь с проблемой. Для Col E мне нужно сделать то же самое косвенное для списка таблиц, но, если COL C текущих строк = «не используется», тогда используется значение COL B, иначе используется значение COL C.

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

 =INDIRECT("TBL_Device_Interfaces[" amp; INDIRECT(IF(INDIRECT("C" amp; ROW()) = "not used", "B", "C") * ROW()) amp; "]")
  

Затем я попробовал, но это не сработало:

 =If(INDIRECT("C" amp; ROW()) = "not used", INDIRECT("TBL_Device_Interfaces[" amp; INDIRECT("B" amp; ROW()) amp; "]"), INDIRECT("TBL_Device_Interfaces[" amp; INDIRECT("C" amp; ROW()) amp; "]"))
  

Но это то, что меня убивает. Потому что это работает… но мне нужны статические столбцы, но динамические строки на основе текущей строки:

 =If($C$6 = "not used", INDIRECT("TBL_Device_Interfaces[" amp; INDIRECT("B" amp; ROW()) amp; "]"), INDIRECT("TBL_Device_Interfaces[" amp; INDIRECT("C" amp; ROW()) amp; "]"))
  

ПРИМЕЧАНИЕ: я набрал это вручную с автономного компьютера. Извините, если есть какие-либо ошибки типа os (например, неправильное написание косвенного). Их не будет в основном коде. У меня есть, если все работает в сегментах, но я не могу заставить его работать при проверке данных.

Я также уверен, что есть другой способ создать выпадающий список. Мне просто нужно иметь возможность ссылаться на таблицы значений, используя index / match и косвенные ссылки.

Ответ №1:

Вы смешиваете разные стили ссылок на ячейки. Если вы подумаете о том, как ваша формула будет выполнять свою фразу «Go проверьте TBL_Device_Interfaces[B3]». Вы можете увидеть, как создавать ссылки на структурированные таблицы здесь .Вам нужно либо придерживаться ссылки на структурированную таблицу, либо вернуться к стандартной ссылке.

Попробуйте свою формулу как:

 =IF($C$6 = "not used", INDIRECT( INDIRECT("B" amp; ROW()) ), INDIRECT(INDIRECT("C" amp; ROW()) ))
  

или, если вы хотите придерживаться структурированной ссылки, попробуйте:

 =IF(TBL_Device_Interfaces[@Column3] = "not used", TBL_Device_Interfaces[@Column2], TBL_Device_Interfaces[@Column1])
  

Возможно, у вас неправильные столбцы, но это должно сработать.

Комментарии:

1. Столбец B = маршрутизатор 1, столбец C = маршрутизатор 2, столбец D = интерфейс 1, столбец E = интерфейс 2. Всегда есть два интерфейса. Мне нужен список значений данных, чтобы отражать интерфейсы из таблицы на основе выбора типа модели в COL C… если нет второго маршрутизатора, в котором он будет извлекать список интерфейсов типа модели в COL B.

2. Например: интерфейсы Cisco = Gi, Te. Juniper interface = ge, xe. COL B ROW()= Cisco, COL C ROW()= Juniper. Я хочу, чтобы выпадающий список столбцов был ge или xe. Но если COL E = Cisco, я хочу, чтобы это был Gi или Te. Как я уже сказал, это пример, список if более обширный и содержит много типов моделей. Также причина, по которой я не определяю точную ячейку и использую косвенное в функции if, заключается в том, что это служба, которая создается для каждой строки. Поэтому мне нужно использовать один и тот же выпадающий список для 100 строк, и я не хочу продолжать редактировать отдельные строки. Мне нужно динамическое решение, основанное на выборе текущей строки

3. Также стоит упомянуть, что данные в COL B и C являются значениями заголовка таблицы для интерфейсов. Именно поэтому я использую ссылки на таблицы.

4. Можете ли вы загрузить упрощенный пример?

5. Понял, извините. Вы не можете использовать Row() в списке проверки данных.