ARTICLE · 1198002
Excel VBA编程-一键用 VBA 自动发邮件(Outlook)
Excel VBA编程-一键用 VBA 自动发邮件(Outlook)
你有没有过这种经历:月底把报表做好了,要挨个发给十几个客户或门店,你打开 Outlook,一封一封地填收件人、写主题、贴附件、点发送……手都点麻了,还容易漏发、发错人。其实,只要写一小段 VBA,在 Excel 里点一下,邮件就能自动从 Outlook 飞出去——收件人、主题、正文、甚至附件,全都能替你填好。
今天我们从网络上整理了一批 Excel VBA“调用 Outlook 发邮件”的实用技巧,核心就一句话:Excel 自己不会发邮件,但它能“借”你电脑上的 Outlook 来发。这套做法在国内外都最常用,我们来拆解一下大家公认的要点:
Microsoft Learn 官方示例:先用 CreateObject("Outlook.Application")把 Outlook 启动起来(没开就自动开一个),再用CreateItem(0)新建一封空白邮件,然后填好.To(收件人)、.Subject(主题)、.Body(正文),最后用.Send直接发出去。官方那个例子还演示了把 A 列所有邮箱地址拼成“收件人清单”,一封邮件群发给大家。ExcelXYZ 的实战经验:发邮件前先用 GetObject看看 Outlook 是不是已经开着,开着就接着用、没开再启动,省得重复开窗口;新手建议先用.Display把邮件弹出来“看一眼”,确认内容没错再手动点发送,等熟练了再改成.Send全自动发出。ExcelDelta 的关键技巧:收件人、主题、正文不必写死在代码里,可以直接换成单元格里的值,比如 .To = Range("A1").Value,这样一份模板就能按每行数据发出不同内容的邮件。MyExcelTools 的批量思路:如果有 500 行客户数据,用循环逐行读每一行的邮箱和姓名,把各自的姓名、订单号套进正文,就是一套“批量个性化群发”系统,几分钟发完原本要干一下午的活。
把这些经验揉到一起,我们这篇只讲一个核心套路:启动 Outlook → 新建空白邮件 → 填收件人/主题/正文 → 显示预览或直接发送。下面用 3 个由浅入深的案例带你走一遍。
(小前提:这套方法需要你电脑上装了 Outlook,并且已经登录了邮箱。VBA 只是“指挥”Outlook 发,真正发出邮件的还是 Outlook 本身。)
案例一(简单):一键发一封固定内容的邮件(先看一眼再发)
功能说明 这个案例最安全,适合第一次试手。运行后,Outlook 会自动弹出一封写好的邮件:收件人、主题、正文我都帮你填好了,你只需要看一眼内容对不对,再点 Outlook 里的“发送”就行。为什么要“先弹出来”?因为新手第一次发,最怕代码一运行邮件就嗖地飞走了、内容还没看清。先预览,心里有底。
代码
Sub 一键发邮件_固定内容() ' 启动 Outlook,新建一封空白邮件,填好内容后弹出来给你看 Dim olApp As Object Dim olMail As Object Set olApp = CreateObject("Outlook.Application") Set olMail = olApp.CreateItem(0) olMail.To = "boss@company.com" ' 收件人,换成真实邮箱 olMail.Subject = "今日销售日报" ' 邮件主题 olMail.Body = "领导好,今日销售日报已整理完成,请查收。" & vbCrLf & _ "此邮件由 Excel VBA 自动生成。" olMail.Display ' 先弹出来给你看,确认无误再点“发送” ' 想直接发出去、连预览都不要?把上面这行改成:olMail.SendEnd Sub操作步骤
按 Alt + F11打开 VBA 编辑器,点菜单「插入」→「模块」。把上面的代码整段粘进去。把 boss@company.com改成你自己的邮箱(方便测试),主题和正文也可以随手改。回到 Excel,按 Alt + F8,选中「一键发邮件_固定内容」,点「运行」。Outlook 会自动弹出一封写好的邮件。看一眼没错,就点 Outlook 里的「发送」。 想跳过预览、运行就直接发?把代码最后一行 olMail.Display改成olMail.Send再运行即可。
小提示:
CreateObject("Outlook.Application")这一句,就相当于“让 Excel 去把 Outlook 叫起来”。如果 Outlook 本来没开,它会自动开一个;如果已经开着,就接着用,很省心。
案例二(中等):运行时输入收件人、主题、正文,一键直接发出
功能说明 案例一里收件人、主题、正文都写死在代码里,换个人发就得改代码。这个案例改成:运行后弹三个框,分别让你填“收件人邮箱”“邮件主题”“邮件正文”,填完点确定,邮件就直接发出去了(用 .Send)。这样同一段代码,今天发给张三、明天发给李四,都不用改半个字。
代码
Sub 一键发邮件_自选内容() ' 运行时分别输入收件人、主题、正文,确认后直接发出 Dim olApp As Object Dim olMail As Object Dim 收件人 As String Dim 主题 As String Dim 正文 As String 收件人 = InputBox("请输入收件人邮箱:", "发邮件") If 收件人 = "" Then MsgBox "没填收件人,已取消。", vbInformation Exit Sub End If 主题 = InputBox("请输入邮件主题:", "发邮件") 正文 = InputBox("请输入邮件正文:", "发邮件") Set olApp = CreateObject("Outlook.Application") Set olMail = olApp.CreateItem(0) olMail.To = 收件人 olMail.Subject = 主题 olMail.Body = 正文 olMail.Send ' 直接发出去 MsgBox "邮件已发送给 " & 收件人 & "!", vbInformationEnd Sub操作步骤
把代码粘进同一个模块(和案例一放在一起也行)。 回到 Excel,按 Alt + F8运行「一键发邮件_自选内容」。依次在弹框里填收件人邮箱、主题、正文,每次填完点「确定」。 填完,邮件会立刻从你的 Outlook 发出去,并弹出一个“已发送”的提示框。 想再发给别人?重新运行,填新的内容即可;收件人留空点取消,就不会发。
关键点:
.Send是“立刻发出”,没有反悔机会;.Display是“先弹出来”。你自己掂量用哪个——正式群发前,建议先用.Display试一两封。
案例三(实用小案例):把当前工作表导出成 PDF,作为附件自动发出
功能说明 真实工作里最常用的是这一招:你刚把报表做好,不想先存 PDF、再开 Outlook、再手动挂附件,而是想“在 Excel 里点一下,PDF 自动生成、自动挂到邮件上、自动发出去”。这个案例把上一篇学的「导出 PDF」和今天学的「发邮件」串起来:先用 ExportAsFixedFormat 把当前表变成 PDF 存在本文件同文件夹,再用 .Attachments.Add 把这个 PDF 挂到邮件上直接发走。收件人运行时现填,主题自动带上表名,正文写一句“请查收”。
代码
Sub 一键把当前表发邮件带附件() ' 先把当前表导出成 PDF,再用 Outlook 把这个 PDF 当附件发出去 Dim olApp As Object Dim olMail As Object Dim 收件人 As String Dim 文件路径 As String ' 文件没保存过就没有“所在文件夹”,先提醒,避免导出失败 If ActiveWorkbook.Path = "" Then MsgBox "请先把本 Excel 文件保存到电脑上,再发带附件的邮件。", vbExclamation Exit Sub End If ' 第一步:当前表导出成 PDF(复用上篇学过的方法) 文件路径 = ActiveWorkbook.Path & "\当前工作表.pdf" ActiveSheet.ExportAsFixedFormat _ Type:=xlTypePDF, _ Filename:=文件路径, _ Quality:=xlQualityStandard, _ IncludeDocProperties:=True, _ IgnorePrintAreas:=False, _ OpenAfterPublish:=False ' 第二步:运行时填收件人,留空就取消 收件人 = InputBox("请输入收件人邮箱:", "发邮件") If 收件人 = "" Then MsgBox "没填收件人,已取消发送。", vbInformation Exit Sub End If ' 第三步:调 Outlook 发邮件,把刚导出的 PDF 挂上 Set olApp = CreateObject("Outlook.Application") Set olMail = olApp.CreateItem(0) olMail.To = 收件人 olMail.Subject = "报表附件:" & ActiveSheet.Name olMail.Body = "您好,附件是本工作表的 PDF,请查收。" olMail.Attachments.Add 文件路径 ' 把 PDF 作为附件挂上去 olMail.Send MsgBox "邮件已发出,附件:" & 文件路径, vbInformationEnd Sub操作步骤
把代码粘进模块(和前两个可以放在同一个模块里)。 回到 Excel,先确认本文件已经保存过(标题栏不是“工作簿1”),并切到你想发出的那张表。 按 Alt + F8运行「一键把当前表发邮件带附件」。弹框里输入收件人邮箱,点「确定」。 邮件会带着这张表的 PDF 自动从 Outlook 发出去;同文件夹里也会留下一份「当前工作表.pdf」备份。
关键经验(来自网络实战总结):
Excel 只是指挥,Outlook 才是发件人:前提是电脑装了 Outlook 且已登录邮箱,否则 CreateObject会报错。.Display和.Send二选一:练习用.Display看效果,正式发用.Send全自动。附件就是一行 .Attachments.Add 路径:路径可以是导出的 PDF、也可以是电脑上任何真实存在的文件。内容别写死:收件人、主题、正文都能换成 Range("A1").Value这种单元格取值,一份模板就能群发不同内容(进阶篇会讲按名单循环群发)。保存工作簿一定要存成 .xlsm格式,否则宏会丢失。
知识点小结
用 VBA 发邮件,本质上就是把“人手动开 Outlook、填收件人、写正文、点发送”这件事,翻译成四步固定动作:叫起 Outlook → 开空白邮件 → 填收件人/主题/正文 → 显示或直接发送。四句话记牢就够用:
叫起 Outlook → CreateObject("Outlook.Application"),没开它会自动开;开空白邮件 → CreateItem(0),得到一封什么都没填的邮件;填内容 → 邮件.To = 收件人、邮件.Subject = 主题、邮件.Body = 正文,想带附件就加一句邮件.Attachments.Add 路径;发不发 → 邮件.Display先弹出来看一眼,邮件.Send直接飞出去。
它和前面学的「导出 PDF」「自动生成图表」「条件格式标红」是一套组合拳:图表管“趋势一眼懂”、条件格式管“哪里异常”、PDF 导出管“成果交出去”、发邮件管“直接送到对方手里”。四样都用上,你的表格从做好、到报警、到出图、到发走,全程不用手动点一下。
【SVG 示意图】
下一篇预告:把邮件发出去只是开始。下一篇我们继续从网络上抓取新的 VBA 实用技巧,带你解锁下一个“一键”操作——比如把一整列名单循环群发、每人正文都不一样,几分钟干完一下午的活。
【往期 VBA 精选】
系列已更新 60+ 篇,挑几篇最实用的继续看:
从0学 Excel VBA 第1篇:认识 VBA,什么是宏?[72] 进销存实战第1篇:系统设计与初始化[73] CRM 客户管理第1篇:系统设计与初始化[74] Excel 一键系列:用 VBA 把表格批量导出成 PDF[75] 界面自定义第1篇:自定义菜单与工具栏[76]
关注公众号「西哥的AI幻觉」,对话框发送「VBA」可获取完整目录。
【西哥能帮你做什么】
办公自动化 · AI 视频生产 · AI 编程助手落地 · 工厂数字化
把 Excel / VBA / Python 里那些重复到吐的活,一次性自动化掉 批量产出「古诗每日一诵」式 AI 古诗词视频(配音 + 配图 + 合成一键完成) OpenClaw / WorkBuddy 等 AI 编程助手的企业内训与落地陪跑 从 PLC 到 MES 的工厂务实数字化方案
【找到我】
公众号「西哥的AI幻觉」:点文章右上角「···」设为星标,更新不迷路 加微信:LekonWang(备注「VBA」进学习交流群)
本文由西哥原创,转载请注明出处「西哥的AI幻觉」。















































































