[英]VBA to outlook with signature failure
最近我一直在尝试自动化一些直接从 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 对象模型时的安全触发器。 尝试在不需要在代码中创建新Application
实例的 Outlook VBA 环境中使用相同的代码。 如果问题不可重现并且代码工作正常,就是这样!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.