夜雨聆风学习资料网

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

操作步骤

  1. 按 Alt + F11 打开 VBA 编辑器,点菜单「插入」→「模块」。
  2. 把上面的代码整段粘进去。把 boss@company.com 改成你自己的邮箱(方便测试),主题和正文也可以随手改。
  3. 回到 Excel,按 Alt + F8,选中「一键发邮件_固定内容」,点「运行」。
  4. Outlook 会自动弹出一封写好的邮件。看一眼没错,就点 Outlook 里的「发送」。
  5. 想跳过预览、运行就直接发?把代码最后一行 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

操作步骤

  1. 把代码粘进同一个模块(和案例一放在一起也行)。
  2. 回到 Excel,按 Alt + F8 运行「一键发邮件_自选内容」。
  3. 依次在弹框里填收件人邮箱、主题、正文,每次填完点「确定」。
  4. 填完,邮件会立刻从你的 Outlook 发出去,并弹出一个“已发送”的提示框。
  5. 想再发给别人?重新运行,填新的内容即可;收件人留空点取消,就不会发。

关键点:.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

操作步骤

  1. 把代码粘进模块(和前两个可以放在同一个模块里)。
  2. 回到 Excel,先确认本文件已经保存过(标题栏不是“工作簿1”),并切到你想发出的那张表。
  3. 按 Alt + F8 运行「一键把当前表发邮件带附件」。
  4. 弹框里输入收件人邮箱,点「确定」。
  5. 邮件会带着这张表的 PDF 自动从 Outlook 发出去;同文件夹里也会留下一份「当前工作表.pdf」备份。

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

  • Excel 只是指挥,Outlook 才是发件人:前提是电脑装了 Outlook 且已登录邮箱,否则 CreateObject 会报错。
  • .Display 和 .Send 二选一:练习用 .Display 看效果,正式发用 .Send 全自动。
  • 附件就是一行 .Attachments.Add 路径:路径可以是导出的 PDF、也可以是电脑上任何真实存在的文件。
  • 内容别写死:收件人、主题、正文都能换成 Range("A1").Value 这种单元格取值,一份模板就能群发不同内容(进阶篇会讲按名单循环群发)。
  • 保存工作簿一定要存成 .xlsm 格式,否则宏会丢失。

知识点小结

用 VBA 发邮件,本质上就是把“人手动开 Outlook、填收件人、写正文、点发送”这件事,翻译成四步固定动作:叫起 Outlook → 开空白邮件 → 填收件人/主题/正文 → 显示或直接发送。四句话记牢就够用:

  1. 叫起 Outlook → CreateObject("Outlook.Application"),没开它会自动开;
  2. 开空白邮件 → CreateItem(0),得到一封什么都没填的邮件;
  3. 填内容 → 邮件.To = 收件人、邮件.Subject = 主题、邮件.Body = 正文,想带附件就加一句 邮件.Attachments.Add 路径;
  4. 发不发 → 邮件.Display 先弹出来看一眼,邮件.Send 直接飞出去。

它和前面学的「导出 PDF」「自动生成图表」「条件格式标红」是一套组合拳:图表管“趋势一眼懂”、条件格式管“哪里异常”、PDF 导出管“成果交出去”、发邮件管“直接送到对方手里”。四样都用上,你的表格从做好、到报警、到出图、到发走,全程不用手动点一下。

【SVG 示意图】 


下一篇预告:把邮件发出去只是开始。下一篇我们继续从网络上抓取新的 VBA 实用技巧,带你解锁下一个“一键”操作——比如把一整列名单循环群发、每人正文都不一样,几分钟干完一下午的活。

【往期 VBA 精选】

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

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

【西哥能帮你做什么】

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

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

【找到我】

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

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

相关学习资料