2

Вот рабочий лист A:

Parent    Kid        Age
------    ---        ---
John      Scott      5
John      Lucas      7
John      Elisabeth  12
Victoria  Jason      3
Victoria  Amy        5
Jenifer   Ashely     13
Jenifer   Jared      17

И рабочий лист B:

Parent    Kid        Team
------    ---        ----
John      Elisabeth  Lions
Jenifer   Ashely     Sharks
Jenifer   Jared      Panters

На листе B я хочу, чтобы мои пользователи могли выбирать имя ребенка из списка выбора (используя проверку данных). Значения этого списка выбора должны определяться именами детей, введенными для этого родителя в листе A. Например, если я выберу ячейку A2, список выбора должен содержать:

Scott
Lucas
Elisabeth

Могу ли я сделать это с помощью обычной формулы или я должен использовать VBA?

2 ответа2

0

Я не совсем уверен, является ли это самым простым способом, но если он уверен, что родители сгруппированы в Рабочем листе A (так, как будто вы написали, а не как например.

John     Scott
Victoria Jason
John     Lucas

), вы можете рассмотреть возможность использования этого решения (я предполагаю, что данные вашего рабочего листа A начинаются с "Джон" в ячейке A2, WA обозначает рабочий лист A, а WB обозначает рабочий лист B):

Прежде всего, добавьте еще один столбец, который называется смещение в WA. Поскольку "Возраст" - это столбец C , я поместил его в столбец D Формула имеет вид =Row(A2)-Row($A$2) и распространяется вниз. Вы должны получить 0 , 1 , 2 ... Это смещения каждой строки по отношению к первой.

Мы будем использовать это значение для нашего смещения с помощью функции VLOOKUP . Допустим, в WB вы вводите имя своего родителя в ячейку A1 , в B1 мы получим имя (имена) ребенка. Итак, во вспомогательном столбце, скажем C , мы помещаем формулу

=VLOOKUP(A1; WA!$A$2:$D$xxx; 4; FALSE)

параметры означают:

  • A1 - это значение ячейки, которое вы ищете - имя родителя
  • WA!$A$2:$D$xxx обозначает диапазон, в котором вы ищете (замените xxx на количество строк, которое вы получите)
  • 4 означает, что мы хотим получить значение 4-го столбца, то есть WA!D в этом случае, и это наше смещение
  • FALSE означает, что мы хотим выполнить точный поиск как WA!A

Полученное вами значение - это значение, с которого должен начинаться ваш диапазон. Теперь нам нужно найти его окончание, это значит, сколько там строк. Самым простым способом может быть добавление еще одного столбца в WA, например, E , где мы помещаем простую формулу, подсчитывающую, сколько детей имеет родительский элемент:

=COUNTIF($A$2:$A$xxx; A2)

В вашем примере вы получите 3 , 3 , 3 , 2 , 2 , 2 , 2 .

Вы должны скопировать это значение в WB, столбец D , используя снова:

=VLOOKUP(A1; WA!$A$2:$E$xxx; 5; FALSE)

Теперь в WB мы имеем в столбце A имя родителя, в столбце B мы вставляем дочерний элемент, в столбце C смещение первого дочернего элемента родителя, а в столбце D количество дочерних элементов, которое имеет родительский элемент.

Теперь перейдите к менеджеру имен и добавьте новое имя Kids охватывающее ассортимент:

=OFFSET(WA!$B$2:$B$xxx; WB!D1; 0; WB!E1)

где параметры означают:

  • WA$B$2:$B$xxx - это диапазон, содержащий дочерние имена,
  • WB!D1 (примечание: это относительно!) это смещение, поэтому, где дочерний список начинается в ранее упомянутом диапазоне в WA,
  • 0 означает, что мы не хотим делать смещение в столбцах,
  • WB!E1 говорит, сколько строк мы хотим получить (т.е. сколько детей).

Имея это имя для Kids , вы добавляете сейчас в WB!B1 Проверка данных, установите список и источник =Kids . Теперь распространяйте это вниз.

Это все.

Если ваши данные в WA не содержат сгруппированных родителей, вы можете получить их, отсортировав их.

0

В итоге я создал именованный диапазон под названием Kids со следующей формулой:

=OFFSET(WA!$B$2, MATCH(INDIRECT("A" & ROW()), WA!$A$2:$A$8, 0) - 1, 0, COUNTIF(WA!$A$2:$A$200, INDIRECT("A" & ROW())), 1)

А затем установите список проверки на =Kids .

В случае, если кто-то удивился, я использовал INDIRECT("A" & ROW()) потому что простое использование A1 вернуло ошибку (мой excel-fu недостаточно силен, чтобы понять, почему). Делать ВБ!А1 работал нормально, но я не хотел идти по этому пути, потому что мне пришлось повторно использовать этот диапазон имен в других листах этой книги. Если есть лучший способ, я был бы рад услышать это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .