在 Excel 中使用 VBA 创建的电子邮件未发送
Posted
技术标签:
【中文标题】在 Excel 中使用 VBA 创建的电子邮件未发送【英文标题】:Email created using VBA in Excel not sending 【发布时间】:2017-07-22 21:41:33 【问题描述】:我在 Excel 中有一些 VBA 代码,可以通过 Outlook 创建和发送自动电子邮件。但是,除非我手动打开 Outlook 以触发“发送/接收”,否则不会发送实际消息。下面是我用来创建电子邮件的代码。我认为我只需要一行代码来触发发送/接收代码。但是我应该指出,在这段代码中 Outlook 没有打开。所以解决问题的一种方法可能是在这段代码之前打开outlook,然后在代码之后关闭它。
Function RDB_Mail_PDF_Outlook(FileNamePDF As String, StrTo As String, _
StrCC As String, StrBCC As String, StrSubject As String, _
Signature As Boolean, Send As Boolean, StrBody As String)
Dim OutApp As Object
Dim OutMail As Object
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
If Signature = True Then .Display
.To = StrTo
.CC = StrCC
.BCC = StrBCC
.Subject = StrSubject
.htmlBody = StrBody & "<br>" & .HTMLBody
.Attachments.Add FileNamePDF
If Send = True Then
.Send
Else
.Display
End If
End With
On Error GoTo 0
SendReceiveAll = True
Set OutMail = Nothing
Set OutApp = Nothing
End Function
【问题讨论】:
调用函数时,请确保将 Send 参数设置为 True。 设置为真。也许我需要检查 Outlook 中的某些设置或选项? 另外,我添加了 sendreceiveall =true 代码行。在我添加该行之前,它的执行方式相同。 注释掉(或临时删除)On Error Resume Next
,然后再试一次。你有错误吗?
【参考方案1】:
这是意料之中的 - 消息提交是一个异步过程,Outlook 在它有机会发送消息之前关闭。
将 OutApp 变量设为全局变量,以便在您的子程序完成时不会释放它,然后调用 OutApp.Session.SendAndReceive
。
【讨论】:
谢谢德米特里。我尝试了一些与您的建议相关的事情,但似乎没有奏效。我一定对在哪里添加你所说的关于 OutApp.Session.Sendandreceive 的代码感到困惑。该代码应位于何处。还有,让 OutApp 成为全局变量的最佳位置在哪里?在我的代码的开头还是在函数的开头?并确认我应该通过编码“public”而不是“Dim”来使其全球化,正确吗?先谢谢了!!!!!! 在全局级别上在您的函数之外声明 OutApp。调用 Send 后调用 SendAndReceive。以上是关于在 Excel 中使用 VBA 创建的电子邮件未发送的主要内容,如果未能解决你的问题,请参考以下文章
使用Excel VBA发送带有图表对象的电子邮件 - Office 2013
如何使用 VBA 在 Excel 中添加连接(到外部数据源)并将其保存到该 Excel 电子表格的连接列表