You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA多收件人批量发邮件:逐行读日期按需加附件方法

VBA扩展Excel逐行发邮件功能实现方案

你现有逐行遍历C列邮箱生成邮件的循环逻辑可以直接复用,两个扩展功能不需要重构原有代码,只需要在单封邮件的生成逻辑块里补充对应行的取值、判断操作即可,具体实现方式如下:

核心实现逻辑

  • 逐行匹配D列日期:遍历数据行时,直接通过当前循环行号定位D列单元格取值即可,和同行走C列取邮箱的逻辑完全一致,不会出现行数据错位。取到日期后建议先做格式化处理,避免Excel日期序列值直接显示为5位数字,替换掉正文里提前留好的占位符就行。
  • E列可选附件追加:同样取当前循环行E列的文件路径,先判断单元格非空、且路径对应的文件真实存在,再调用附件添加方法追加到邮件里,不影响原有固定附件的加载;如果E列为空或者路径无效直接跳过即可,不会中断批量发件流程。

可直接复用的代码示例

假设你的数据表第1行是表头,有效数据从第2行开始,固定附件路径提前写在常量里,正文预留日期插入位:

Sub SendEmailWithRowData()
    Dim olApp As Object, olMail As Object
    Dim lastRow As Long, i As Long
    Dim fixedAttachPath As String, customAttachPath As String
    Dim mailBody As String, sendDate As String
    
    ' 配置项 - 按需修改
    fixedAttachPath = "C:\固定文件\通用通知.pdf" ' 原有固定附件路径
    Const mailSubject = "请查收对应日期的通知材料" ' 邮件主题
    
    ' 初始化Outlook(后期绑定,不需要手动加库引用)
    On Error Resume Next
    Set olApp = GetObject(, "Outlook.Application")
    If olApp Is Nothing Then Set olApp = CreateObject("Outlook.Application")
    On Error GoTo 0
    If olApp Is Nothing Then
        MsgBox "请先启动Outlook再运行宏"
        Exit Sub
    End If
    
    ' 取C列最后一行有有效数据的行号
    lastRow = Cells(Rows.Count, "C").End(xlUp).Row
    
    ' 逐行遍历生成邮件
    For i = 2 To lastRow ' 从第2行开始,跳过表头行
        ' 跳过C列邮箱为空的无效行
        If Trim(Cells(i, "C").Value) <> "" Then
            ' 取当前行D列日期,按需求格式化
            sendDate = Format(Cells(i, "D").Value, "yyyy年mm月dd日")
            ' 组装邮件正文,插入对应日期
            mailBody = "您好:" & vbCrLf & vbCrLf & _
                       "请查收" & sendDate & "对应的相关材料,详见附件。" & vbCrLf & vbCrLf & _
                       "此致"
            ' 创建新邮件
            Set olMail = olApp.CreateItem(0)
            With olMail
                .To = Cells(i, "C").Value ' 读取当前行C列收件人地址
                .Subject = mailSubject
                .Body = mailBody
                ' 加载原有固定附件
                If Dir(fixedAttachPath) <> "" Then .Attachments.Add fixedAttachPath
                ' 判断当前行E列是否有附件路径,校验存在后追加
                customAttachPath = Trim(Cells(i, "E").Value)
                If customAttachPath <> "" Then
                    If Dir(customAttachPath) <> "" Then
                        .Attachments.Add customAttachPath
                    End If
                End If
                ' 调试阶段用.Display弹出邮件预览,确认无误后可替换为.Send自动发送
                .Display
            End With
            Set olMail = Nothing
        End If
    Next i
    
    Set olApp = Nothing
    MsgBox "邮件生成完成"
End Sub

注意事项

  • E列存储的必须是本地文件绝对路径或者局域网共享UNC路径(比如\\公司共享盘\材料\合同001.docx),网页链接无法直接作为附件添加,需要先下载到本地再填写路径
  • 调试阶段建议先用.Display方法弹出邮件预览,确认收件人、日期、附件都匹配正确后再改成.Send自动发送,避免发错内容
  • 如果需要发送HTML格式的富文本正文,把.Body属性替换为.HTMLBody即可,日期替换、附件添加的逻辑完全不变

内容的提问来源于stack exchange,提问作者Doors

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:57:26