使用oft模板发邮件:以K9起单元格为收件人,循环代码运行无错但未发送
解决VBA发送oft模板邮件时批量收件人无效的问题
我来帮你搞定这个问题!你现在的状况很典型:空循环+错误的行号计算导致邮件发不出去,去掉循环后只能发单个收件人。咱们一步步来修复:
问题根源拆解
- 空循环等于没执行任何操作:你写的
for i = 9 to lastrow next i只是空转了一遍,根本没把K列的收件人收集起来,所以收件人列表是空的,自然发不出邮件。 - 用
CountA获取最后一行不可靠:Application.WorksheetFunction.CountA(ws.Range("K:K"))会统计整列所有非空单元格的数量,如果K1-K8有内容,这个数值会包含那些行,导致lastrow可能小于9,循环直接跳过;如果K9下面有空白单元格,也会漏掉后面的有效收件人。
修正后的完整代码
Sub SendBulkEmailFromOFT() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("你的工作表名称") ' 替换成实际工作表名 ' 正确获取K列从K9开始的最后一个非空行 Dim lastRow As Long lastRow = ws.Range("K" & ws.Rows.Count).End(xlUp).Row ' 收集有效收件人(跳过空白单元格) Dim recipientList As String recipientList = "" Dim i As Long For i = 9 To lastRow ' 跳过空白或仅含空格的单元格 If Trim(ws.Range("K" & i).Value) <> "" Then If recipientList <> "" Then recipientList = recipientList & "; " ' Outlook默认用分号分隔多个收件人 End If recipientList = recipientList & ws.Range("K" & i).Value End If Next i ' 确保有有效收件人才发送 If recipientList <> "" Then Dim olApp As Object Dim olMail As Object ' 初始化Outlook对象 Set olApp = CreateObject("Outlook.Application") ' 加载你的OFT模板(替换成实际模板路径) Set olMail = olApp.CreateItemFromTemplate("C:\路径\你的模板.oft") ' 设置收件人列表 olMail.To = recipientList ' 可选:如果需要修改主题/正文(模板里没设置的话) ' olMail.Subject = "批量邮件主题" ' olMail.HTMLBody = "自定义正文内容" & olMail.HTMLBody ' 追加到模板正文 ' 发送邮件(用olMail.Display可以先预览再手动发送) olMail.Send ' 释放对象 Set olMail = Nothing Set olApp = Nothing MsgBox "批量邮件发送完成!" Else MsgBox "未找到有效收件人,请检查K9及以下单元格内容!" End If End Sub
关键细节说明
- 用
End(xlUp)找最后一行:ws.Range("K" & ws.Rows.Count).End(xlUp).Row会从K列最后一行往上找第一个非空单元格,精准定位到你需要的最后一个收件人行。 - 跳过空白单元格:加入
Trim(...) <> ""的判断,避免收件人列表里混入无效的空字符串,导致Outlook识别失败。 - 收件人分隔符:Outlook默认用分号
;分隔多个收件人,如果你用的是其他分隔符(比如逗号),可以替换成对应的符号。
内容的提问来源于stack exchange,提问作者Christopher Leandro Kwok
相关产品推荐
相关产品推荐

