VBA里用Intersect取选中区域和已使用区域的交集
分享一个VBA里经常被忽略的细节:用Intersect取交集时,返回值可能是Nothing,不判空直接操作大概率要崩。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-09-30 04:00:40 VBA Outlook 办公自动化
日常做运营、行政或者财务岗的话,批量发格式统一的定制邮件基本是家常便饭。每封改个客户名、调下字体,几十封下来不仅费时间,还容易看错行发错人。用VBA把Excel和Outlook串起来,让脚本去读数据、拼内容、调格式,能省掉不少重复劳动。
跑这段代码有两个前提,先确认好:一是Excel已经开了宏和VBA功能,二是在VBA编辑器里加了Outlook的对象引用。加引用也简单,打开VBE之后点顶部的工具→引用,在列表里找到Microsoft Outlook xx.x Object Library打上勾就行,版本号跟你本地装的Office版本对应,Office 2016及以后一般是16.0。
我这段代码做的事不复杂,运行后弹个框让你输行号,去对应行把收件人、抄送、客户信息读出来,再把预设的主题和正文模板里的占位符替换掉,最后生成一封字体统一的邮件草稿直接弹出来给你核对,不会自动发出去,相对稳妥,适合需要人工确认一遍的场景。
Sub SendEmailDraftCustom_Final_NoHighlight()
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Dim ws As Worksheet
Dim rowCount As Integer
Dim guestName As String
Dim clientNumber As String
Dim toAddress As String
Dim ccAddress As String
Dim subject As String
Dim body As String
' 设置工作表,实际使用时改成自己的表名
Set ws = ThisWorkbook.Sheets("Sheet1")
' 弹窗获取目标行号
rowCount = Val(InputBox("请输入需要的行数(例如输入2表示第二行)", "输入行数"))
' 校验输入合法性
If rowCount <= 0 Then
MsgBox "请输入一个有效的行数。", vbExclamation
Exit Sub
End If
' 读取对应单元格数据,列号按自己的表调整
guestName = ws.Cells(rowCount, 7).Value ' G列:客人名称
clientNumber = ws.Cells(rowCount, 5).Value ' E列:客户编号
toAddress = ws.Cells(rowCount, 10).Value ' J列:收件人
ccAddress = ws.Cells(rowCount, 11).Value ' K列:抄送
subject = ws.Cells(42, 19).Value ' S42:邮件主题模板
body = ws.Cells(43, 19).Value ' S43:邮件正文模板
' 替换主题中的占位符
subject = Replace(subject, "[GuestName]", guestName)
subject = Replace(subject, "[ClientNumber]", clientNumber)
' 替换正文中的占位符
body = Replace(body, "[GuestName]", guestName)
' 创建Outlook实例
Set olApp = New Outlook.Application
Set olMail = olApp.CreateItem(olMailItem)
With olMail
.To = toAddress
.CC = ccAddress
.Subject = subject
' 用HTML格式设置正文字体
.HTMLBody = "<html><body><font face='等线' size='3'>" & body & "</font></body></html>"
.Display ' 显示草稿,确认后手动发送
End With
' 释放对象,避免残留后台进程
Set olMail = Nothing
Set olApp = Nothing
MsgBox "邮件草稿已生成!", vbInformation
End Sub
里面的单元格引用都是示例配置,G列存客人名称,E列是客户编号,J列收件人,K列抄送,主题和正文模板放在S42和S43单元格。
实际用的时候照着自己的表改列号就行,占位符也可以随便加,改模板不用动代码逻辑。
直接在VBE里按F5就能跑,或者在Excel里插个按钮绑定这个宏,给不会用VBA的同事用也方便。输入行号点确定,Outlook就会自动弹出新邮件窗口,内容格式都弄好了,检查一遍没问题就可以发。
说个容易踩的坑。
最开始我试过直接改MailItem的Body属性来设置字体,结果要么不生效,要么不同收件人那边显示乱七八糟。后来换成HTMLBody属性就顺了,用HTML来渲染邮件正文,想改字体、字号,或者给特定内容标黄、加粗,直接写对应的标签就行,灵活度高很多。
还有个细节,最后把olApp和olMail置空的两行别删。之前图省事省过,跑个三五次没感觉,次数多了任务管理器里一堆Outlook后台进程,占内存不说,下次调用还经常报COM组件错误,平白多排半天错。
其实做技术做久了都有这个习惯,能自动化的就不手动。
不光是办公里的邮件,像服务器端SSL证书申请续签这种事,手动走验证、部署流程既麻烦又容易忘到期,用lcjmSSL就省心不少,免费支持多域名、泛域名和IP证书,自动完成申请、DNS验证和部署,还有简洁的API可以对接自己的运维系统,底层对接的都是Let's Encrypt这类主流可信CA,不用自己折腾ACME协议的细节。
这段VBA逻辑不复杂,改改单元格对应关系就能适配大部分批量发邮件的场景,日常发通知、对账函、客户提醒都能用,有需要的直接拿去改就行。
上一篇: FreeType的FT_Render_Glyph渲染逻辑拆解
下一篇: 聊聊Java复杂条件表达式的拆解与优化
分享一个VBA里经常被忽略的细节:用Intersect取交集时,返回值可能是Nothing,不判空直接操作大概率要崩。
记一下用 VBA 批量处理单元格格式的几个常用操作,边框清除、字号改成 8、内容居中对齐,三件事放在一起刚好覆盖了报表输出里最常改动的部分。
一个处理 Excel 里文本数字比较的 VBA 宏,用 CDbl 转换后标出差异,顺手记录了错误忽略和扩展方式。
本文详细解析VBA模块重命名的两种高效方法:首选的属性窗口直观操作,以及需谨慎使用的VBA代码自动化实现。同时,提供标准模块和类模块的专业命名规范,助你快速构建清晰、易维护的VBA项目结构。
还在为Excel中不同格式的数字比较烦恼吗?本文教你用VBA宏,将指定列(如G、H列)的值智能转换为数字,并进行精准对比。一旦发现数值不符,立即自动标黄,让你轻松识别数据异常,告别繁琐手动校对,大幅提高数据处理效率与准确性。