如何从一列中查找每个值并使用“;”返回电子邮件地址分隔器

Posted

技术标签:

【中文标题】如何从一列中查找每个值并使用“;”返回电子邮件地址分隔器【英文标题】:How to look up each value from one column and return email addresses with ";" separator 【发布时间】:2021-02-18 04:52:50 【问题描述】:

这已解决using a formula。 不幸的是,我需要一个适用于 Excel 2016 的解决方案,而且似乎 VBA 是最好/唯一的途径。

图例:(这是跨同一工作簿中的多个工作表) 每列都有一个标题。 Sheet3 的 A 列:名称列表 Sheet3 的 H 列:电子邮件地址列表 Sheet1 的 M 列:包含向下拖动的以下公式,它产生可变数量的数据行: =IFERROR(INDEX($A$2:$A$42,MATCH(0,IF("1"=$L$2:$L$42,COUNTIF($O$1:$O1,$A$2:$A$42),""),0)),"")

在 Sheet1 的 M 列中,我有一个 Index/Match 公式,其中填充了人名列表。 (如上所述,出现的名字的数量是不断变化的。)

我想对照 Sheet3 的 A 列查找 Sheet1 的 M 列中出现的每个名称,然后从 Sheet3 的 H 列返回相应的电子邮件地址。

另外,我想用分号分隔每个电子邮件地址,因为这是为了填充 Outlook 电子邮件的“收件人”字段。

数据外观的快照

| A, Sheet3       | H, Sheet3                | M, Sheet1     |
| --------------- | ------------------------ | ------------- |
| John Smith      | JohnSmith@email.com      | Frank Sinatra |
| Kimberly Jones  | Kimberly@email.com       | Corey Smith   |
| Joe Montana     | JoeMontana@email.com     | Kimberly Jones|
| Dean Martin     | DeanMartin@email.com     | John Smith    |
| Corey Smith     | Corey.Smith@email.com    |               |
| Frank Sinatra   | Frank.Sinatra@email.com  |               |

在 Sheet1 的单元格 F2 中,宏将生成以下内容:

Frank.Sinatra@email.com; Corey.Smith@email.com; Kimberly@email.com; JohnSmith@email.com      

工作表标签名称:

工作表1:

工作表3:

【问题讨论】:

您可能正在寻找UDF version of TEXTJOIN。 哦,太棒了。谢谢本。我会看看我是否可以尝试弄清楚这里发生了什么以及如何结合 XLookup...这将是我第一次做这样的事情 【参考方案1】:

试试,

Function JoinEmail() As String
    Dim Ws(1 To 2) As Worksheet
    Dim vDB As Variant, vR() As Variant
    Dim vName As Variant
    Dim Dic As Object  'Dictionary
    Dim i As Long, n As Integer
    Dim s As String
    
    Set Ws(1) = Sheets(1)
    Set Ws(2) = Sheets(3)
    
    Set Dic = CreateObject("Scripting.Dictionary")
    
    vDB = Ws(2).UsedRange 'Sheets(3) data
    With Ws(1)
        vName = .Range("M2", .Range("M" & Rows.Count).End(xlUp))
    End With
    
    For i = 2 To UBound(vDB, 1)
        Dic.Add vDB(i, 1), vDB(i, 8) 'name, email
    Next i
    
    For i = 1 To UBound(vName, 1)
        s = vName(i, 1)
        If Dic.Exists(s) Then
            n = n + 1
            ReDim Preserve vR(1 To n)
            vR(n) = Dic(s)
        End If
    Next i
    If n Then
        JoinEmail = Join(vR, "; ")
    Else
        JoinEmail = ""
    End If
    
End Function

Sheet1 图片

Sheet3 图片

【讨论】:

非常感谢 Dy 的帮助。我遇到了麻烦。我添加了几行,我将在您的帖子中以粗体字表示。随意删除,因为我不确定它是否正确。 我想我不能加粗我的编辑,因为它显示为代码,所以它只是显示在星号之间。当我运行代码时,没有任何反应,不知道为什么 只需在您的单元格中输入=JoinEmail() 嗯。我收到#NAME? 错误。我在哪个单元格或工作表中输入=JoinEmail() 是否重要?另外,感谢您恢复到您的代码 没关系,我更改了模块的名称并消除了 #NAME? 错误。但现在它只会产生一个空单元格,而不是您在屏幕截图中显示的内容...我会尝试玩弄它

以上是关于如何从一列中查找每个值并使用“;”返回电子邮件地址分隔器的主要内容,如果未能解决你的问题,请参考以下文章

R:如何使用其他列中的数据在一列中创建多个新值并为每个新值重复行?

Excel VBA:从一列中的字符串中查找和删除多个值

Excel - 在表格中查找值并根据以前的数据填充空白单元格

根据另一列的位置从一组列中返回值

Excel:跨多列查找值并返回标题列

在表列中查找值并返回表行号 - VBA