You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改Excel VBA代码实现批量发送带附件的邮件?

批量发送带附件的Excel VBA邮件解决方案

嘿,你的问题很典型——原代码只针对第2行的单条记录生成邮件,要实现批量发送,核心就是遍历所有有效数据行,为每一行创建独立的邮件。下面是修改后的完整代码,我会把关键改动点给你讲清楚:

修改后的VBA代码

Option Explicit
Sub SendBulkMails()
    Dim objOutlook As Object
    Dim objMail As Object
    Dim lastRow As Long
    Dim i As Long
    
    ' 初始化Outlook应用对象
    Set objOutlook = CreateObject("Outlook.Application")
    
    ' 自动获取数据区域的最后一行(以A列序号为判断依据,空行视为数据结束)
    lastRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
    
    ' 从第2行开始循环遍历所有记录(第1行是表头)
    For i = 2 To lastRow
        ' 为当前行创建新的邮件实例
        Set objMail = objOutlook.CreateItem(0)
        
        With ActiveSheet
            With objMail
                .To = .Range("C" & i).Value ' 读取当前行的收件邮箱
                .CC = .Range("D" & i).Value ' 补充读取抄送邮箱(原表格D列你之前没用到,这里加上)
                .Subject = .Range("E" & i).Value ' 读取邮件主题
                .Body = .Range("G" & i).Value ' 读取邮件内容
                
                ' 处理附件:先判断路径是否为空,避免报错
                If Trim(.Range("F" & i).Value) <> "" Then
                    On Error Resume Next ' 防止文件不存在导致整个批量任务中断
                    .Attachments.Add .Range("F" & i).Value
                    On Error GoTo 0
                End If
                
                .Display ' 如果你想直接发送不用预览,把这行改成 .Send 即可
            End With
        End With
        
        ' 及时释放当前邮件对象,避免内存占用
        Set objMail = Nothing
    Next i
    
    ' 释放Outlook对象
    Set objOutlook = Nothing
    MsgBox "批量邮件创建完成!", vbInformation
End Sub

关键改动说明

  • 新增循环逻辑:通过lastRow自动识别最后一行数据,用For循环遍历每一条记录,每行生成独立邮件
  • 补充抄送功能:原表格D列是抄送邮箱,之前的代码没用到,现在帮你补上了
  • 容错处理:添加了附件路径空值判断和错误捕获,就算某行的文件路径无效,也不会中断整个批量任务
  • 内存优化:循环内及时释放单个邮件对象,避免长时间运行占用过多内存

使用小提示

  • 确保Outlook处于打开状态(或者代码会自动启动Outlook,但可能需要你授权访问)
  • 如果不需要预览邮件直接发送,把.Display替换成.Send就行
  • 待发送文件的路径必须是绝对路径(比如D:\Projects\Report.pdf),相对路径可能会导致找不到文件

内容的提问来源于stack exchange,提问作者Mr.M

火山引擎 最新活动