%3F.png)
У меня много данных, которые выглядят примерно так. Они состоят из двух столбцов:
Имя | Электронная почта |
---|---|
боб | [email protected] |
боб | [email protected] |
боб | [email protected] |
Салли | [email protected] |
Салли | [email protected] |
Но мне нужно, чтобы это выглядело так. Одно имя в строке, с адресами электронной почты, добавленными в качестве дополнительных столбцов по мере необходимости. Для каждого имени есть неизвестное количество адресов электронной почты:
Имя | Электронная почта 1 | Электронная почта 2 | Электронная почта 3 |
---|---|---|---|
боб | [email protected] | [email protected] | [email protected] |
Салли | [email protected] | [email protected] |
Мне нужно сделать это для огромной таблицы с тысячами строк. Поэтому я не могу вручную преобразовать каждую из них с помощью чего-то вроде транспонирования. Мне нужно массовое/пакетное/автоматизированное решение.
Я знаю, что VBA существует, но я не знаю, как его закодировать. Если это решение, можете ли вы дать мне направление, как должен выглядеть код?
Решения, не использующие VBA, также приветствуются.
решение1
С использованиемМиллери начиная с этого CSV:
Name,Email
bob,[email protected]
bob,[email protected]
bob,[email protected]
sally,[email protected]
sally,[email protected]
Вы можете запустить:
mlr --csv nest --ivar ";" -f Email then nest --explode --values --across-fields -f Email then unsparsify input.csv >output.csv
чтобы получить:
Имя | Электронная почта_1 | Электронная почта_2 | Электронная почта_3 |
---|---|---|---|
боб | [email protected] | [email protected] | [email protected] |
Салли | [email protected] | [email protected] | - |
решение2
Начиная с вашего примера, столбец A: Имя, столбец B: Электронная почта.
- Введите эту формулу массива:
=INDEX($A$2:$A$6, MATCH(0, COUNTIF($D$1:$D1, $A$2:$A$16), 0))
в пустую ячейку, например D2, и нажмите клавиши Shift + Ctrl + Enter одновременно, чтобы получить правильный результат, см. снимок экрана:
- Перетащите ячейку вниз, чтобы заполнить все значения в столбце D. Результат будет таким, как на снимке экрана выше.
- В клеткеЕ2где вы хотите, чтобы ваш адрес электронной почты вставьте эту формулу
=IFERROR(INDEX($B$2:$B$16, MATCH(0,COUNTIF($D2:D2,$B$2:$B$16)+IF($A$2:$A$16<>$D2,1,0),0)),"")
- Перетащите ячейку вправо на 5–10 ячеек (или на столько, сколько вы считаете достаточным), чтобы заполнить ее, а затем перетащите строку вниз, чтобы заполнить адреса электронной почты каждого человека.
решение3
решение4
Если у вас новая версия Excel, вы можете использовать эти формулы.
Тогда вы можете сделать это следующим образом:
Синийтаблица имеет имя
Table1
.
Использованные формулы:
- Э3:
=UNIQUE(Table1[Name])
- Ф2:Н2:
="Mail"&COLUMN()-COLUMN($E$2)
- F3 (растянута вниз):
=INDEX(Table1[Mail];FILTER(TRANSPOSE(SORT(UNIQUE((ROW(Table1[Name])-ROW(Table1[[#Headers];[Name]]))*($E3=Table1[Name]))));TRANSPOSE(SORT(UNIQUE((ROW(Table1[Name])-ROW(Table1[[#Headers];[Name]]))*($E3=Table1[Name]))))>0;""))
Таблица заполнена функцией SPILL новых версий Excel.
Пример файла:https://1drv.ms/x/s!ArVkYVSHnABFiiqzBYLPmoubvdHY?e=p7wOeF
Если вы используете старую версию Excel, большую часть функционала можно эмулировать с помощью функций массива. Но это становится гораздо более хаотичным...