从 Word 到 Outlook 的 VBA PasteAndFormat 导致错误 5097

问题描述 投票:0回答:2

我实际上认为这可能是一个软件问题,因为我一直使用的代码已经工作了很多年,直到上周。但尽管如此,如果没有管理员权限,除了寻找解决方法之外我无能为力。

无论如何,我有一个程序可以为我生成一个模板,并将其发送到 Outlook 以用于邮寄目的。然而从上周开始,一行代码开始出现错误。

Set oOutlookApp = GetObject(, "Outlook.Application")
If Err.Number = 429 Then
    Err.Clear
    Set oOutlookApp = CreateObject("Outlook.Application")
End If    

Set oMailItem = oOutlookApp.CreateItem(0)

ActiveDocument.Content.Copy
With oMailItem
    .SentOnBehalfOfName = email1
    .To = frmEmailGen.txtEmail.Text
    .CC = frmEmailGen.txtEmail2.Text & ";" & emailCC
    .BCC = emailBCC
    .Subject = emailSubject & frmEmailGen.txtAddress.Text
    .HTMLBody = ""
    .Display
    
    pdfFile = PDFPath & "\" & UCase(frmEmailGen.txtAddress.Text) & ".pdf"
    
   .Attachments.Add PDFFilePath
            
End With

Dim mailWord As Object
Set mailWord = oMailItem.GetInspector.WordEditor
mailWord.Range(0).PasteAndFormat (wdFormatOriginalFormatting) '<- ERROR on this line

显示错误 5097,Word 遇到问题。

由于某种原因,它不喜欢使用原始格式将模板粘贴到 Outlook。我用简单的 .Paste 替换了代码,它确实有效,但这不是我想要的。

奇怪的是,当在该部分放置断点并让代码停在那里时,代码就可以将模板粘贴到 Outlook 中了。根据这些信息,很多人说这可能是一个计时问题,代码在程序响应之前就已经运行了,所以添加一个延迟。我尝试了 Application.Wait 和 Sleep 函数,这两个函数都无法让代码粘贴模板。

我尝试使用其他粘贴方法也失败了。但由于模板仍在我的剪贴板中,我尝试忽略错误(On Error Resume Next),通过 CTRL+V 自行粘贴模板,它可以工作,尽管它使用的是 Outlook 的格式。粘贴选项出现,当选择使用源格式时,模板现在是正确的。

但是事情变得更奇怪 - 我应该能够设置默认的粘贴选项以仅保留源格式,但这不起作用。 Outlook 始终使用新选项“使用目标主题”,该选项甚至不是默认粘贴操作的选项。唯一的选项是“保留源”、“合并格式”和“仅保留文本”。所有选项都设置为“保留源格式”,但根本不起作用。

所以我已经怀疑这可能是一个程序问题,如果它允许我通过文本粘贴电子邮件,而不是模板的原始格式。

尽管如此,在我要求 IT 对 Office 安装进行修复之前,我想看看是否还有其他方法可以将模板粘贴到 Outlook。有没有人愿意分享一下方法?

更新:它刚刚完成在线修复,但这并没有解决问题,它仍然会在同一行上导致错误..

另一个奇怪的行为:当我创建一个循环,如果出现错误,将尝试再次粘贴内容,实际上,只要我手动单击 Outlook 邮件窗口,内容就会被粘贴。它粘贴正常并且循环被切断。因此,我尝试了不同的方法来对此进行编码,但最终失败了。只有当我点击它时它才起作用。

vba outlook ms-word office365
2个回答
0
投票

听起来您的 Office 安装可能已损坏。我建议首先修复计算机上的应用程序以排除此类因素。

有问题的代码行包含多个属性和方法调用:

mailWord.Range(0).PasteAndFormat (wdFormatOriginalFormatting) '<- ERROR on this line

我建议通过在单独的代码行上声明每个属性或方法调用来打破调用链。按照这种方式,您将能够找到在运行时抛出错误的确切属性或方法。


0
投票

选择.PasteAndFormat wdFormatOriginalFormatting

我发现这行代码突然导致我的宏崩溃,没有任何我能找到的特殊原因。也许是微软更新?

无论如何,我发现我可以使用 F8 单步执行代码,并且它会正常工作。

为了解决该问题,我在该代码行之前使用 InputBox 插入了一个暂停。

MyValue = InputBox("按任意键", "暂停").

宏现在可以正常工作了。

© www.soinside.com 2019 - 2024. All rights reserved.