Я собираюсь максимально упростить свою задачу. У меня есть два листа в Excel. На первом листе я создаю список местоположений. Мне нужно выбрать область, где находится местоположение в столбце A, прежде чем я смогу ввести местоположение в столбце B. В следующем столбце (C) будет идентификатор, который будет создан автоматически (для первого местоположения ID-001, второе получает ID 002 и т. д.).
На втором листе я создаю список активов. Поэтому я снова выбираю область в столбце A и ввожу имя актива в столбец B. Теперь я хочу иметь раскрывающийся список в столбце C, где он показывает мне только те идентификаторы из первой таблицы, у которых площадь одинаковая. Я пытался использовать функцию OFFSET, но не хватает какого-то "select if" (вроде countif или sumif), чтобы ограничить список идентификаторов теми, у которых одинаковая площадь.
В каждой области может быть много локаций и активов, но каждая локация и каждый актив могут быть сопоставлены только с одной локацией.
С нетерпением жду ваших ответов, ребята! Было бы здорово получить решение на Excel или VBA.
решение1
Я предлагаю создать вспомогательный столбец, который включает уникальные значения для использования в VLOOKUP. Например; предположим, у вас есть Area1, Area2, Area3 и Area1 (снова) и так далее. Объедините эти значения с инкрементными значениями (например, 01, 02, 03, ...) и создайте 01Area1, 01Area2, 01Area3 и02Область1. Теперь вы знаете, что вызывать для каждого элемента списка на втором листе. Если вы выберетеПлощадь1в столбце А, то вам нужен поискинкрементный номер&Площадь1. Инкрементные числа по значениям могут быть созданы с помощьюСЧЁТЕСЛИфункция, использующая расширяющийся диапазон:
=COUNTIF($A$2:A2,A2)
Расширяя диапазон, формула учитывает только значения до своей строки. Единственная помеха этого метода вам нужно создать элементы списка вв другом месте
Вот две ссылки, описывающие подобное использование:
решение2
Если предположить, что сортировка таблицы Locations допустима, то простейшее решение подразумевает только относительно короткую формулу проверки данных и пару именованных диапазонов. Вспомогательные столбцы или строки не требуются.
Создайте два примера рабочих листов Locations
и Assets
, как показано ниже:
Добавьте два определенных имени:
Areas
→=Locations!$A:$A
IDs
→=Locations!$C:$C
Наконец, добавьте проверку данных раскрывающегося списка в ячейке на C2
рабочем Assets
листе со следующей формулой, а затем заполните/скопируйте и вставьте ячейку вниз:
=INDEX(IDs,MATCH(A2,Areas,0)):INDEX(IDs,MATCH(A2,Areas,0)+COUNTIF(Areas,A2)-1)
Недостатки этого метода:
- Необходимо использовать определенные имена.
- Таблица «Местоположения» должна быть отсортирована.
- Другие таблицы на листе Locations не могут безопасно пересекать столбец,
Area
если только они не гарантированно не содержат значений, совпадающих со значениями таблицы LocationArea
.
Следующее альтернативное решение преодолевает недостатки, за исключением других таблиц. Однако оно использует ячейки на листе Assets для хранения элементов раскрывающихся списков.
Рабочий лист «Активы» содержит дополнительные столбцы:
На этот раз C2
формула проверки данных выглядит так:
=IF(SUMPRODUCT(--ISNA(C2:INDEX(2:2,COLUMN(C2)-1+COUNTA(C2:INDEX(2:2,COLUMNS(2:2))))))=0,$I$1,C2:INDEX(2:2,COLUMN(C2)-1+COUNTA(C2:INDEX(2:2,COLUMNS(2:2)))-SUMPRODUCT(--ISNA(C2:INDEX(2:2,COLUMN(C2)-1+COUNTA(C2:INDEX(2:2,COLUMNS(2:2))))))))
Введите эту формулу D2
и заполните ее:
=
IF(
SUMPRODUCT(
--ISNA(
E2:INDEX(
(2:2),
COLUMN(E2)-1+MAX(1,COUNTA(E2:INDEX(2:2,COLUMNS(2:2))))
)
)
)=0,
"ERROR",
"ok"
)
Многоячеечный массив — введите эту последнюю формулу в ячейки, начиная с E2
и до максимального числа ожидаемых местоположений в области (для показанного примера я использовал E2:I2
):
=
INDEX(
Locations!$C:$C,
IFERROR(
SMALL(
IFERROR(1/(1/(
(Locations!$A$2:INDEX(Locations!$A:$A,COUNTA(Locations!$A:$A))=IF($A2="",NA(),$A2))
*ROW($A$2:INDEX($A:$A,COUNTA(Locations!$A:$A)))
)),FALSE ),
COLUMN(INDEX(2:2,1):INDEX(2:2,MAX(2,COUNTIF(Locations!$A$2:INDEX(Locations!$A:$A,COUNTA(Locations!$A:$A)),$A2))))
),
NA()
)
)