修复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
关键修改说明
- 定位最后一行有效数据:
用ws.Cells(ws.Rows.Count, "A").End(xlUp).Row替代无限循环,精准获取A列最后一个有内容的行号,从根源避免遍历空区域。 - 循环终止条件:
外层循环使用i <= lastRow,确保只遍历到有效数据的最后一行,不会读取空单元格。 - 空单元格处理:
添加If Trim(currentRecipient) = "" Then判断,跳过A列中间的空行,继续下一行处理。 - 优化遍历逻辑:
用i = j直接跳转到下一个不同收件人的行,避免重复处理同一收件人,提升运行效率。
示例数据参考
| A列(收件人邮箱) | E列(姓名) |
|---|---|
| test1@example.com | Tom |
| test1@example.com | Jerry |
| test2@example.com | Alice |
| test2@example.com | Bob |
| test3@example.com | Shirt,Gray |
修改后的代码会在处理完最后一行test3@example.com后,因i超过lastRow自动终止循环,不会再尝试读取空单元格,彻底解决报错问题。
内容的提问来源于stack exchange,提问作者learningthisstuff
相关产品推荐
相关产品推荐

