夜雨聆风学习资料网

ARTICLE · 1205558

Excel VBA编程-一键循环群发邮件给名单

Excel VBA编程-一键循环群发邮件给名单

上一讲我们学会了用 VBA「发一封」邮件:启动 Outlook、填好收件人和正文、点一下发出去。但真实办公里更常见的需求是——给一群人分别发同一封通知,而且每个人收到的正文里要带上他自己的名字。比如月底给 30 个门店发「例会通知」,每个店长收到「张伟 您好:本周五下午3点开会」,你要是手动一封封改名字、点发送,手点麻了还容易漏。

这一讲我们从网络上整理了一批 Excel VBA「按名单循环群发」的实用技巧,核心就一句话:用一个循环,让 Excel 从第 2 行一路读到名单末尾,每一行都新建一封邮件、把那一行的邮箱和姓名填进去、再发出去。这套做法在国内外都最常用,我们来拆解一下大家公认的要点:

  • ExcelMacroClass 的批量思路:先用 CreateObject("Outlook.Application") 叫起 Outlook,再用 For r = 2 To 末行 从第 2 行循环到最后一行,每一圈都用 CreateItem(0) 新建一封独立邮件,把 .To 设成当前行的邮箱、.Body 里用 Range("B" & r).Value 拼上姓名,最后 .Send 发出去;练习阶段把 .Send 换成 .Display 先弹出来看一眼。
  • Microsoft Learn 官方示例:用 For iCounter = 1 To 行数 逐行读 A 列的邮箱地址,演示了「一行一行取出来再处理」的通用写法,和我们循环名单的思路完全一致。
  • 腾讯云实战经验:名单摆成「A 列邮箱、B 列姓名」,循环里用 cell.Offset(0, -1).Value 取到同一行的姓名,拼进正文,实现「每人一封、内容不同」。
  • ExcelWiz 的关键提醒:邮件对象(CreateItem(0))要放在循环里面,每一圈新建一封独立邮件,发完 Set olMail = Nothing 释放掉;这样每个人收到的都是自己那一封,不会串。

把这些经验揉到一起,我们这篇只讲一个核心套路:循环读名单 → 每圈建一封 → 填收件人加姓名 → 发出去。下面用 3 个由浅入深的案例带你走一遍。

(小前提:这套方法需要你电脑上装了 Outlook,并且已经登录了邮箱。VBA 只是「指挥」Outlook 发,真正发出邮件的还是 Outlook 本身。)


案例一(简单):一键给整张名单循环发通知,正文带上各自姓名

功能说明 这是最基础的循环群发。你只要把名单摆在当前表:第 1 行是表头(A1 写「邮箱」、B1 写「姓名」),从第 2 行开始每行一个人(A 列邮箱、B 列姓名),运行这一段,Excel 就会从第 2 行一路读到最后一行,给每个人发一封「例会通知」,正文开头自动带上「某某 您好:」。第一次试建议把 .Send 改成 .Display,先弹出一两封看看效果。

代码

Sub 一键循环群发_固定名单()    ' 名单放在当前表:A列=邮箱,B列=姓名(第1行是表头)    ' 从第2行循环到最后一行,每人发一封带名字的通知    Dim olApp As Object    Dim olMail As Object    Dim 末行 As Long    Dim i As Long    末行 = Cells(Rows.Count, 1).End(xlUp).Row   ' 找A列最后一个有内容的行    Set olApp = CreateObject("Outlook.Application")    For i = 2 To 末行        Set olMail = olApp.CreateItem(0)        ' 每一圈新建一封独立邮件        olMail.To = Cells(i, 1).Value           ' A列:收件人邮箱        olMail.Subject = "关于本月例会时间的通知"        olMail.Body = Cells(i, 2).Value & " 您好:" & vbCrLf & _                      "本月例会定于本周五下午3点,会议室201,请准时参加。" & vbCrLf & _                      "此邮件由 Excel VBA 自动发送。"        olMail.Send                             ' 直接发出;想先看一眼就改成 olMail.Display        Set olMail = Nothing    Next i    Set olApp = Nothing    MsgBox "群发完成!共发给 " & (末行 - 1) & " 位同事。", vbInformationEnd Sub

操作步骤

  1. 在 Excel 里新建一张表,第 1 行写表头:A1 填「邮箱」、B1 填「姓名」;第 2 行起每行填一个人的邮箱和姓名(至少填两三行方便测试)。
  2. 按 Alt + F11 打开 VBA 编辑器,点菜单「插入」→「模块」,把上面的代码整段粘进去。
  3. 回到 Excel,按 Alt + F8,选中「一键循环群发_固定名单」,点「运行」。
  4. 邮件会一封封从 Outlook 自动发出去,最后弹出一个「共发给 N 位同事」的提示。
  5. 想先看看效果、别真发出去?把代码里的 olMail.Send 改成 olMail.Display 再运行,每封会先弹出来,你确认无误再手动点发送。

小提示:Cells(i, 1) 就是「第 i 行第 1 列」,也就是 A 列第 i 行;Cells(i, 2) 是 B 列第 i 行。循环让 i 从 2 一直变到末行,于是每一行的人都会收到一封属于自己的邮件。


案例二(中等):运行时输入起止行,只给名单里指定区间的人发

功能说明 案例一是一口气发完整张名单。这个案例改成:运行后弹两个框,让你分别输入「从第几行开始」和「发到第几行结束」,只给这段区间里的人发。比如你只想重发第 3 到第 8 行那几位,不用改名单、不用改代码,运行的时候输一下就行。这在学习、分段补发时特别方便。

代码

Sub 一键循环群发_指定区间()    ' 运行时输入起始行和结束行,只给这段名单发    Dim olApp As Object    Dim olMail As Object    Dim 起始行 As Long    Dim 结束行 As Long    Dim i As Long    起始行 = Val(InputBox("请输入从第几行开始发(不含表头,例如 2):", "群发"))    结束行 = Val(InputBox("请输入发到第几行结束(例如 8):", "群发"))    If 起始行 = 0 Or 结束行 = 0 Then        MsgBox "行号没填对,已取消。", vbInformation        Exit Sub    End If    Set olApp = CreateObject("Outlook.Application")    For i = 起始行 To 结束行        Set olMail = olApp.CreateItem(0)        olMail.To = Cells(i, 1).Value        olMail.Subject = "本周任务提醒"        olMail.Body = Cells(i, 2).Value & " 您好:" & vbCrLf & _                      "请于本周内完成你负责的跟进事项,谢谢!"        olMail.Send        Set olMail = Nothing    Next i    Set olApp = Nothing    MsgBox "已发给第 " & 起始行 & " 到 " & 结束行 & " 行,共 " & (结束行 - 起始行 + 1) & " 位。", vbInformationEnd Sub

操作步骤

  1. 把代码粘进同一个模块(和案例一放在一起也行)。
  2. 回到 Excel,按 Alt + F8 运行「一键循环群发_指定区间」。
  3. 第一个框输入起始行(比如 3),点「确定」;第二个框输入结束行(比如 8),点「确定」。
  4. 程序只给第 3 到第 8 行这几位发邮件,最后提示「共 6 位」。
  5. 起始行或结束行留空、或填成 0,程序会提示「行号没填对」并自动取消,不会误发。

关键点:Val(InputBox(...)) 把输入框里的文字变成数字;For i = 起始行 To 结束行 就只在这个区间里转圈,名单其他部分完全不动。


案例三(实用小案例):循环群发 + 出错自动跳过 + 最后报告成败

功能说明 真实名单里难免有「邮箱空着」「地址写错」的行,要是有一封发失败,整个宏卡住、后面的人全收不到,那就糟了。这个案例加上一句「出错先别停」,某一封失败也不会中断其他人;全部跑完后,弹窗告诉你「成功几封、失败几封」,方便你回头补发失败的那些。练习阶段同样建议把 .Send 改成 .Display。

代码

Sub 一键循环群发_带报告()    ' 循环群发,某一封失败也不中断,最后报告成功/失败数    Dim olApp As Object    Dim olMail As Object    Dim 末行 As Long    Dim i As Long    Dim 成功 As Long    Dim 失败 As Long    末行 = Cells(Rows.Count, 1).End(xlUp).Row    成功 = 0    失败 = 0    Set olApp = CreateObject("Outlook.Application")    For i = 2 To 末行        On Error Resume Next          ' 这一封出错先别停,继续下一封        Set olMail = olApp.CreateItem(0)        olMail.To = Cells(i, 1).Value        olMail.Subject = "系统升级通知"        olMail.Body = Cells(i, 2).Value & " 您好,系统将于今晚22点升级,请提前保存文件。"        olMail.Send        If Err.Number = 0 Then            成功 = 成功 + 1          ' 没报错,算成功一封        Else            失败 = 失败 + 1          ' 报错了,算失败一封            Err.Clear                ' 清掉错误,准备下一封        End If        On Error GoTo 0              ' 恢复正常的报错提示        Set olMail = Nothing    Next i    Set olApp = Nothing    MsgBox "群发结束:成功 " & 成功 & " 封,失败 " & 失败 & " 封。", vbInformationEnd Sub

操作步骤

  1. 把代码粘进模块(和前两个可以放在同一个模块里)。
  2. 故意在名单里留一行「邮箱空着」或「写成 abcdef」这种错误地址,用来测试容错。
  3. 回到 Excel,按 Alt + F8 运行「一键循环群发_带报告」。
  4. 程序会把能发的全发出去,最后弹窗报告「成功 N 封,失败 M 封」——失败的那些就是名单里地址有问题的行,你照着补一下就行。
  5. 想先不真发、只看成败统计?把代码里的 olMail.Send 改成 olMail.Display 再运行,每封会先弹出来。

关键经验(来自网络实战总结):

  • 循环放外面、邮件建在里面:For...Next 包住 CreateItem(0),每一圈都是一封全新独立的邮件,才不会把不同人的内容混到一起。
  • 用 Cells(i,1)、第 2 行起步:名单第 1 行是表头,循环从 i = 2 开始,正好跳过表头。
  • 正文套姓名:Cells(i,2).Value & " 您好:" 把 B 列的姓名拼到正文开头,每人收到的都不一样。
  • 正式发用 .Send、练习用 .Display:.Send 没有反悔机会,第一次务必用 .Display 先看效果。
  • 出错别慌:On Error Resume Next 兜住单封失败,Err.Number 判断成败,最后一份报告让你清清楚楚。
  • 保存工作簿一定要存成 .xlsm 格式,否则宏会丢失。

知识点小结

用 VBA 按名单群发邮件,本质上就是把「人一封封改名字、点发送」这件事,翻译成一个固定循环:从第 2 行读到末行 → 每圈建一封 → 填收件人加姓名 → 发出去。三句话记牢就够用:

  1. 起 Outlook → CreateObject("Outlook.Application"),没开它会自动开;
  2. 开循环 → For i = 2 To 末行,用 Cells(i,1) 取邮箱、Cells(i,2) 取姓名;
  3. 每圈建一封 → CreateItem(0) 放循环里,填好 .To、.Subject、.Body(用姓名拼正文),.Send 直接发、或 .Display 先看;想容错就用 On Error Resume Next 兜住单封失败、最后报成败。

它和前面学的「导出 PDF」「一键发一封邮件」是一套组合拳:PDF 管「成果交出去」、发一封管「单独沟通」、循环群发管「一对多发通知」——从做表、到出 PDF、到挨个送到每个人手里,全程不用手动点一下。

【SVG 示意图】 


下一篇预告:循环群发解决了「一对多发通知」,但名单里常常混着不同部门、不同状态的人。下一篇我们继续从网络上抓取新的 VBA 实用技巧,带你解锁「一键按条件自动筛选数据,并把筛选结果复制成一张新表」——让 Excel 替你把想要的那几行精准挑出来。


【往期 VBA 精选】

系列已更新 60+ 篇,挑几篇最实用的继续看:

关注公众号「西哥的AI幻觉」,对话框发送「VBA」可获取完整目录与配套源码。

【西哥能帮你做什么】

办公自动化 · AI 视频生产 · AI 编程助手落地 · 工厂数字化

  • 把 Excel / VBA / Python 里那些重复到吐的活,一次性自动化掉
  • 批量产出「古诗每日一诵」式 AI 古诗词视频(配音 + 配图 + 合成一键完成)
  • OpenClaw / WorkBuddy 等 AI 编程助手的企业内训与落地陪跑
  • 从 PLC 到 MES 的工厂务实数字化方案

【找到我】

  • 公众号「西哥的AI幻觉」:点文章右上角「···」设为星标,更新不迷路
  • 加微信:LekonWang(备注「VBA」进学习交流群)

本文由西哥原创,转载请注明出处「西哥的AI幻觉」。

引用链接

[1]从0学 Excel VBA 第1篇:认识 VBA,什么是宏?: https://mp.weixin.qq.com/s/e2yA1Nu72yg7sM45GXl9nA

[2]进销存实战第1篇:系统设计与初始化: https://mp.weixin.qq.com/s/2zg6E3UmNVrxF8W5u3nbcg

[3]CRM 客户管理第1篇:系统设计与初始化: https://mp.weixin.qq.com/s/-gt-sodNMhpPfB-kYZoTTQ

[4]Excel 一键系列:用 VBA 把表格批量导出成 PDF: https://mp.weixin.qq.com/s/Qrf_gRLkCBN-NrRA4DJUHg

[5]界面自定义第1篇:自定义菜单与工具栏: https://mp.weixin.qq.com/s/Rk3YX0bTwtmFs1XJzN7Vrg

相关学习资料