Access调用Outlook发邮件To字段报错:运行时错误'424'对象要求
解决Access VBA批量发送邮件时收件人字段的运行时错误'424'
运行时错误'424'(对象要求)出现在.To = Table1.Email2这一行,核心原因是不能直接通过表名+字段名的方式获取当前记录的邮箱值——你已经通过DAO.Recordset打开了目标数据集,必须从当前遍历的记录集对象rs中读取对应字段。
修正后的完整代码
'code for sending outlook email as a reminder Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("select * from Table1 where Table1.Fieldx = ""No"" and (Date() +3 > Table1.duedate)") 'checking if the recordset has data If Not (rs.EOF And rs.BOF) Then '将Outlook对象创建移到循环外,避免重复创建销毁,提升效率 Dim O As Outlook.Application Dim M As Outlook.MailItem Set O = New Outlook.Application rs.MoveFirst Do Until rs.EOF = True Dim Msg As String Msg = "Dear " & Forms!FormSample.AssignTo & ",<P>" & _ "An email will be sent in 2 days (" & (Date + 2) & ").<P>" & _ "Regards, " Set M = O.CreateItem(olMailItem) With M .BodyFormat = olFormatHTML .HTMLBody = Msg .To = rs!Email2 '修改点:从当前记录集rs中读取Email2字段值 .Subject = "Testing access sending auto email " & Now() .Send End With Set M = Nothing rs.MoveNext '关键:遍历完一条记录后必须移动到下一条,否则会无限循环 Loop Set O = Nothing Else MsgBox "there are no records in the recordset" End If
关键修改说明
- 收件人字段修正:将
.To = Table1.Email2改为.To = rs!Email2(或.To = rs("Email2"),两种写法等价),通过当前记录集rs获取对应记录的邮箱值,这是解决错误的核心。 - 添加记录移动语句:原代码缺少
rs.MoveNext,会导致循环一直停留在第一条记录,无限发送邮件,必须添加该语句完成记录遍历。 - 优化Outlook对象创建:将Outlook应用对象
O的创建移到循环外部,避免每次循环都重复初始化和销毁对象,既节省资源又减少Outlook安全提示触发概率。
额外提示
如果邮件内容中的AssignTo是对应每条记录的收件人姓名,建议同样从rs中读取(比如rs!AssignTo),而非固定引用窗体控件,这样批量发送的邮件内容会更贴合每条记录的实际情况。
内容的提问来源于stack exchange,提问作者kronos8111
相关产品推荐
相关产品推荐

