我有很多类似这样的数据。它有两列:
但我需要它看起来像这样。每行一个名字,并根据需要将电子邮件添加为额外列。每个名字的电子邮件数量未知:
我必须对包含数千行的大型电子表格执行此操作。因此我无法使用转置之类的方法手动转换每一行。我需要批量/批量/自动化解决方案。
我知道 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
获得:
答案2
从示例开始 A 列:姓名,B 列:电子邮件
=INDEX($A$2:$A$6, MATCH(0, COUNTIF($D$1:$D1, $A$2:$A$16), 0))
在空白单元格(例如 D2)中输入此数组公式: ,然后同时按下 Shift + Ctrl + Enter 键即可获得正确结果,见截图:
- 将单元格向下拖动以填充 D 列中的所有值。其结果将如上面的屏幕截图所示。
- 在细胞内E2您希望在电子邮件中添加此公式
=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
。
使用公式:
- E3:
=UNIQUE(Table1[Name])
- F2:氮:
="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;""))
表格由新版 Excel 的 SPILL 函数填充。
示例文件:https://1drv.ms/x/s!ArVkYVSHnABFiiqzBYLPmoubvdHY?e=p7wOeF
如果您使用的是旧版 Excel,则可以使用数组函数模拟大多数功能。但它会变得更加混乱...