Excel VBA批量发邮件:主题去重并嵌入对应A-D列数据需求
按主题合并发送邮件的VBA修正方案
核心改进点
- 同一主题仅生成一封邮件,避免重复发送
- 将对应主题的A-D列数据嵌入邮件正文
- 修正邮箱列指向(从原代码的H列改为需求中的F列)
修正后的完整代码
Sub SendGroupedEmails() Dim OutApp As Outlook.Application Dim OutMail As MailItem Dim emailDict As Object ' 用于跟踪主题与对应邮件的映射 Dim lr As Long, r As Long Dim subjectKey As String Dim rowContent As String Dim bodySignature As String ' 初始化Outlook应用和字典对象 Set OutApp = New Outlook.Application Set emailDict = CreateObject("Scripting.Dictionary") lr = Cells(Rows.Count, "C").End(xlUp).Row bodySignature = "Thank you," & vbLf & "Xxx Xxx" ' 遍历数据行(从第6行开始) For r = 6 To lr subjectKey = Trim(Range("E" & r).Value) ' 格式化当前行A-D列内容为正文行 rowContent = "A: " & Range("A" & r).Value & vbTab & _ "B: " & Range("B" & r).Value & vbTab & _ "C: " & Range("C" & r).Value & vbTab & _ "D: " & Range("D" & r).Value ' 判断当前主题是否已创建过邮件 If emailDict.Exists(subjectKey) Then ' 已存在,将当前行内容追加到对应邮件正文 Set OutMail = emailDict(subjectKey) OutMail.Body = OutMail.Body & vbLf & rowContent Else ' 不存在,新建邮件并初始化内容 Set OutMail = OutApp.CreateItem(olMailItem) With OutMail .To = Range("F" & r).Value ' 指向需求中的F列邮箱 .Subject = subjectKey .Body = "以下是对应主题的相关数据:" & vbLf & vbLf & rowContent & vbLf & vbLf End With ' 将新邮件存入字典,关联对应主题 emailDict.Add subjectKey, OutMail End If Next r ' 为所有邮件添加签名并显示 For Each OutMail In emailDict.Items OutMail.Body = OutMail.Body & bodySignature OutMail.Display Next OutMail ' 释放资源 Set OutMail = Nothing Set emailDict = Nothing Set OutApp = Nothing End Sub
关键逻辑说明
- 字典分组机制:利用
Scripting.Dictionary存储每个主题对应的邮件对象,确保同一主题不会重复创建邮件。键为主题字符串,值为对应的MailItem对象。 - 正文数据嵌入:遍历每行时,将A-D列内容格式化为统一格式的文本行,若主题已存在则追加到已有邮件,否则作为新邮件的初始正文内容。
- 签名统一处理:所有邮件内容构建完成后,统一添加签名,避免重复写入签名内容。
内容的提问来源于stack exchange,提问作者energy1
相关产品推荐
相关产品推荐

