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

修复VBA遍历Excel生成Outlook邮件时遇空行报错问题

解决VBA遍历Excel数据生成Outlook邮件时遇空单元格/列表末尾报错的问题

问题根源

你的代码未正确判断A列有效数据的结束位置,当遍历到空单元格或列表末尾时,仍尝试读取数据,导致报错。核心解决思路是精准定位A列最后一行有效数据,并在循环中加入终止条件。

修改后的完整代码

Sub SendEmailsWithUniqueRecipients()
    Dim olApp As Object
    Dim olMail As Object
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long, j As Long
    Dim currentRecipient As String
    Dim mailBody As String
    
    ' 指定目标工作表(替换为你的实际工作表名称)
    Set ws = ThisWorkbook.Sheets("Sheet1")
    ' 获取A列最后一行有效数据的行号
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ' 初始化Outlook应用对象
    Set olApp = CreateObject("Outlook.Application")
    
    i = 2 ' 假设第1行是表头,从第2行开始遍历
    Do While i <= lastRow
        currentRecipient = ws.Cells(i, "A").Value
        
        ' 跳过A列的空单元格(处理中间有空行的情况)
        If Trim(currentRecipient) = "" Then
            i = i + 1
            GoTo ContinueLoop
        End If
        
        ' 构建邮件正文开头
        mailBody = "以下是对应您的姓名列表:" & vbCrLf & vbCrLf
        mailBody = mailBody & "- " & ws.Cells(i, "E").Value & vbCrLf
        
        ' 遍历后续行,收集同一收件人的所有E列数据
        j = i + 1
        Do While j <= lastRow And ws.Cells(j, "A").Value = currentRecipient
            mailBody = mailBody & "- " & ws.Cells(j, "E").Value & vbCrLf
            j = j + 1
        Loop
        
        ' 创建并配置Outlook邮件
        Set olMail = olApp.CreateItem(0)
        With olMail
            .To = currentRecipient
            .Subject = "对应姓名列表通知"
            .Body = mailBody
            .Display ' 如需直接发送可改为.Send
        End With
        
        ' 跳转到下一个不同收件人的行
        i = j
ContinueLoop:
    Loop
    
    ' 释放对象,避免内存泄漏
    Set olMail = Nothing
    Set olApp = Nothing
    MsgBox "邮件生成完成!"
End Sub

关键修改说明

  1. 定位最后一行有效数据:
    用ws.Cells(ws.Rows.Count, "A").End(xlUp).Row替代无限循环,精准获取A列最后一个有内容的行号,从根源避免遍历空区域。
  2. 循环终止条件:
    外层循环使用i <= lastRow,确保只遍历到有效数据的最后一行,不会读取空单元格。
  3. 空单元格处理:
    添加If Trim(currentRecipient) = "" Then判断,跳过A列中间的空行,继续下一行处理。
  4. 优化遍历逻辑:
    用i = j直接跳转到下一个不同收件人的行,避免重复处理同一收件人,提升运行效率。

示例数据参考

A列(收件人邮箱)E列(姓名)
test1@example.comTom
test1@example.comJerry
test2@example.comAlice
test2@example.comBob
test3@example.comShirt,Gray

修改后的代码会在处理完最后一行test3@example.com后,因i超过lastRow自动终止循环,不会再尝试读取空单元格,彻底解决报错问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:47:38