使用Excel VBA发送带有签名的Outlook邮件



我正在尝试从Excel发送电子邮件。

下面的VBA代码用于附加文件和包含的文本与我的Outlook标准签名。

最近它失败了,给我以下错误:

应用程序定义或对象定义错误

.HTMLBODY线

当我删除最后一个.HTMLBody时,它运行,但它不包括我的签名。

Sub BodyVsHTMLBody()
Dim ol As Outlook.Application
Dim olMail As Outlook.MailItem
Set ol = New Outlook.Application
Set olMail = ol.CreateItem(olMailItem)
With olMail
.To = Sheet3.Range("C7").Value
.CC = Sheet3.Range("C8").Value
.Subject = Sheet3.Range("C9").Value
.Attachments.Add Sheet3.Range("C11").Value
.Attachments.Add Sheet3.Range("C12").Value
.Display
.HTMLBody = RangetoHTML(Sheet3.Range("C18")) & .HTMLBody
End With

End Sub
Function RangetoHTML(rng As Range)
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook
TempFile = Environ$("temp") & "" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.readall
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")
TempWB.Close savechanges:=False
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function

似乎下面这行代码在运行时抛出了一个错误:

.HTMLBody = RangetoHTML(Sheet3.Range("C18")) & .HTMLBody

首先,您需要记住HTMLBody是一个HTML文档,它表示消息体。虽然Outlook可能会在处理格式不良好的HTML标记时纠正错误,但为了使文档保持一致的状态,我建议在打开<body>之后和关闭</body>标记之前添加额外的位。因此,您的HTML文档将是格式良好的,并且不会导致消息体中的故障。

有问题的代码行包含一个返回一些结果的函数调用。为了找出它返回的是什么,我建议在单独的一行代码中声明一个调用:

Dim tempReturn as String = RangetoHTML(Sheet3.Range("C18"))

在代码中请求HTMLBody属性之前没有时间初始化检查器。所以,我建议先调用Display方法,然后添加附件,这样检查器窗口将被初始化,你可以获得HTMLBody属性。

最后,最后一位是处理Outlook对象模型时的安全触发器。尝试从Outlook VBA环境中使用相同的代码,您不需要在代码中创建新的Application实例。如果问题是不可重现的,代码是正常工作的,那就是它!

相关内容

  • 没有找到相关文章

最新更新