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操作步骤
在 Excel 里新建一张表,第 1 行写表头:A1 填「邮箱」、B1 填「姓名」;第 2 行起每行填一个人的邮箱和姓名(至少填两三行方便测试)。 按 Alt + F11打开 VBA 编辑器,点菜单「插入」→「模块」,把上面的代码整段粘进去。回到 Excel,按 Alt + F8,选中「一键循环群发_固定名单」,点「运行」。邮件会一封封从 Outlook 自动发出去,最后弹出一个「共发给 N 位同事」的提示。 想先看看效果、别真发出去?把代码里的 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操作步骤
把代码粘进同一个模块(和案例一放在一起也行)。 回到 Excel,按 Alt + F8运行「一键循环群发_指定区间」。第一个框输入起始行(比如 3),点「确定」;第二个框输入结束行(比如8),点「确定」。程序只给第 3 到第 8 行这几位发邮件,最后提示「共 6 位」。 起始行或结束行留空、或填成 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操作步骤
把代码粘进模块(和前两个可以放在同一个模块里)。 故意在名单里留一行「邮箱空着」或「写成 abcdef」这种错误地址,用来测试容错。 回到 Excel,按 Alt + F8运行「一键循环群发_带报告」。程序会把能发的全发出去,最后弹窗报告「成功 N 封,失败 M 封」——失败的那些就是名单里地址有问题的行,你照着补一下就行。 想先不真发、只看成败统计?把代码里的 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 行读到末行 → 每圈建一封 → 填收件人加姓名 → 发出去。三句话记牢就够用:
起 Outlook → CreateObject("Outlook.Application"),没开它会自动开;开循环 → For i = 2 To 末行,用Cells(i,1)取邮箱、Cells(i,2)取姓名;每圈建一封 → CreateItem(0)放循环里,填好.To、.Subject、.Body(用姓名拼正文),.Send直接发、或.Display先看;想容错就用On Error Resume Next兜住单封失败、最后报成败。
它和前面学的「导出 PDF」「一键发一封邮件」是一套组合拳:PDF 管「成果交出去」、发一封管「单独沟通」、循环群发管「一对多发通知」——从做表、到出 PDF、到挨个送到每个人手里,全程不用手动点一下。
【SVG 示意图】
下一篇预告:循环群发解决了「一对多发通知」,但名单里常常混着不同部门、不同状态的人。下一篇我们继续从网络上抓取新的 VBA 实用技巧,带你解锁「一键按条件自动筛选数据,并把筛选结果复制成一张新表」——让 Excel 替你把想要的那几行精准挑出来。
【往期 VBA 精选】
系列已更新 60+ 篇,挑几篇最实用的继续看:
从0学 Excel VBA 第1篇:认识 VBA,什么是宏?[1] 进销存实战第1篇:系统设计与初始化[2] CRM 客户管理第1篇:系统设计与初始化[3] Excel 一键系列:用 VBA 把表格批量导出成 PDF[4] 界面自定义第1篇:自定义菜单与工具栏[5]
关注公众号「西哥的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















































































