合并与电子邮件匹配的不同列中的所有行

合并与电子邮件匹配的不同列中的所有行

我在 Windows 10 上使用最新版本的 Excel。我有相当大的数据集。下图是相关信息的摘录。A 列是他们的电子邮件,B 列是他们参与的项目,C 列是他们参与的项目。

因此,我尝试将他们的所有项目集中在一个单元格中,例如 C2,然后我可以手动删除其余项目。

我手动执行此操作 =B2&", "&B3&", "&B4&", "&B5&", "&B6,但由于我的数据集包含 1200 行,我试图找出不必为每个人执行此操作的方法。

我并不害怕 VBA,但更喜欢公式,有办法吗?

提前致谢。谨致问候

它应该是什么样子

答案1

以下简单公式即可:

=IF(COUNTIF($A$2:A2,A2)>1,"",TEXTJOIN(",",TRUE,IF($A$2:$A$1200=A2,$B$2:$B$1200,"")))

外部函数IF()为电子邮件的第 2 到第 1 实例提供空白。它通过检查不断扩大的检查范围(以绝对地址 $A$2 为基准,扩展到相对地址 A2(因此在第 605 行,扩展范围将是 $A$2:A605))来查找 A 列值的多个实例,如果是,则返回空白,否则允许 Excel 继续计算单元格的公式。

请注意,只要有可能,Excel 就会从左到右进行计算,因此此处生成空白的单元格不会将全范围(公式的第二部分)的计算添加到处理负担中。

TEXTJOIN()部分使用 来IF()测试 A 列中的每个单元格是否与其自己的 A 列单元格的值匹配,并创建一个内部结果数组,输入数组为空白时返回 FALSE。 本身TEXTJOIN()会忽略空白,仅留下成功匹配的内容。

如果您需要的只是显示结果,无论它们出现在 C 列的 1200 个单元格中的哪个位置,那就足够了。

如果您希望将该列中收集的结果合并到一个“连接”批次中,则可以在希望显示该批次的任何位置使用以下命令:

=UNIQUE(C2:C8,,TRUE)

(使用第三个参数的值为TRUE可确保空白不会出现在列表中,除非只有一封电子邮件重复了一次。)

SORT()当然,也可以用 进行排序:

=SORT(UNIQUE(C2:C8,,TRUE))

如果您希望在该输出中看到电子邮件地址以及部分字符串,则可以将上面给出的第一个公式更改为以下内容:

=IF(COUNTIF($A$2:A2,A2)>1,"",A2&": "&TEXTJOIN(",",TRUE,IF($A$2:$A$1200=A2,$B$2:$B$1200,"")))

其中该A2&": "&部分将地址添加到TEXTJOIN()输出中。

当然,一旦有了该输出,您就可以根据需要拆分这些字符串。诀窍是获取与每个字符串匹配的正确 A 列值,而当仅使用 C 列中显示的“a、b、c、...”输出时,这很难,因为您如何将其与正确的 A 列值匹配?但将 A 列的值收集到生成的字符串中可以完全克服这个问题。

相关内容