【问题标题】:How can I create emails for only unique addresses from a column in excel?如何仅为 excel 列中的唯一地址创建电子邮件?
【发布时间】:2016-04-14 04:11:03
【问题描述】:

目前,我正在尝试创建要发送给客户的爆炸电子邮件,并且列列表中有一些重复的电子邮件地址。我只想向每个唯一的电子邮件地址发送一封电子邮件,但是当我运行我的宏时,它会为列中的每个单元格创建一封电子邮件,无论该列中早先/晚的地址是否重复。 我的代码的 sn-p 如下:

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

    Set sh = Sheets("TestSheet")

    Set OutApp = CreateObject("Outlook.Application")    

For Each cell In sh.Columns("D").Cells.SpecialCells(xlCellTypeConstants)

    Set rng = sh.Cells(cell.Row, 1).Range("E1:Z1")

        If cell.Value Like "?*@?*.?*" And _
            Application.WorksheetFunction.CountA(rng) > 0 Then

                Set OutMail = OutApp.CreateItem(0)
                Set Entity = cell.Offset(0, -3)
                Set Quarter = cell.Offset(0, -2)
                Set Year = cell.Offset(0, -1)
                Set CCRecip = cell.Offset(0, 1)

                    strbody = "<font face = 'Calibri'><b>Hello All--</b>" & ...

                    signature = "<br>Thank you,<br>" & ...

                        .To = cell.Value
                        .CC = CCRecip.Value
                        .Subject = Entity.Value 
                        .HTMLBody = strbody & signature             
                        .display
                    End With                  
                Set OutMail = Nothing

        End If

Next cell

【问题讨论】:

  • 将电子邮件地址存储在一个集合中,并在创建电子邮件之前检查该集合以查看它是否在其中。如果是,请跳过。
  • 我使用的文件是根据系统报告创建的,并且一直在变化。它与逾期发票有关,因此客户可以在此电子表格上拥有多行。有超过 3000 行记录,每次运行时都可以添加多个新电子邮件地址(以及删除其他电子邮件地址)。因此,创建和维护地址集合可能会变得乏味。
  • 你不维护它。您在代码中使用“集合”对象。我会添加一个答案。
  • 为什么不先从您的电子邮件列表中“删除重复”?然后只需运行代码。 (或者,如果您也想保留原始列表,请复制电子邮件列,然后删除重复项)。或者,为什么不检查当前单元格上方的所有单元格,如果有like 或匹配项,则跳过当前行?

标签: excel vba email outlook


【解决方案1】:
 Dim myColl As Collection
 Set myColl = New Collection

 With Application
     .EnableEvents = False
     .ScreenUpdating = False
 End With

 Set sh = Sheets("TestSheet")

 Set OutApp = CreateObject("Outlook.Application")    

 For Each cell In sh.Columns("D").Cells.SpecialCells(xlCellTypeConstants)

     Set rng = sh.Cells(cell.Row, 1).Range("E1:Z1")

     If cell.Value Like "?*@?*.?*" And _
        Application.WorksheetFunction.CountA(rng) > 0 Then
         If Not Contains(myColl, CStr(cell.Value)) Then
                 myColl.Add CStr(cell.Value), CStr(cell.Value)
                 Set OutMail = OutApp.CreateItem(0)
                 Set Entity = cell.Offset(0, -3)
                 Set Quarter = cell.Offset(0, -2)
                 Set Year = cell.Offset(0, -1)
                 Set CCRecip = cell.Offset(0, 1)

                 strbody = "<font face = 'Calibri'><b>Hello All--</b>" & ...

                 signature = "<br>Thank you,<br>" & ...

                    .To = cell.Value
                    .CC = CCRecip.Value
                    .Subject = Entity.Value 
                    .HTMLBody = strbody & signature             
                    .display
                End With                  
                Set OutMail = Nothing

         End If
    End If

 Next cell

 End Sub

 Public Function Contains(col As Collection, key As Variant) As Boolean
     Dim obj As Variant
     On Error GoTo err
     Contains = True
     obj = col(key)
     Exit Function
 err:

     Contains = False
 End Function

包含由 Vadim here 提供的功能

【讨论】:

  • 当我将它添加到我的代码中时,我开始在“下一个单元格”行上收到一个编译错误,上面写着“没有 For 的下一个”。有什么想法会导致这种情况吗?
  • 是的。在“.display”下的代码中间有一个无关紧要的“End With”,我保持原样,但我猜如果你删除它,代码应该可以编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2018-07-08
  • 2012-10-12
  • 2016-07-21
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多