我正在尝试从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
实例。如果问题是不可重现的,代码是正常工作的,那就是它!