使用 VBA 宏选择和复制 Outlook 电子邮件正文

Posted

技术标签:

【中文标题】使用 VBA 宏选择和复制 Outlook 电子邮件正文【英文标题】:Selecting and copying Outlook email body with a VBA macro 【发布时间】:2015-03-10 13:30:44 【问题描述】:

我是 Excel 中 VBA 宏的初学者,这是 Outlook 中的第一次尝试,但这是我想要做的:

在 Outlook 2010 中,将宏分配给按钮,当按下该按钮时,

    获取活动电子邮件的整个正文 将正文(包括所有格式和 html)复制到剪贴板 打开一个新的word文档 将剪贴板的内容粘贴到这个单词文档中 清除剪贴板

到目前为止,我只有下面的第 1 步和第 3 步(我想知道我是否在第 1 步中以错误的方式进行此操作):

Sub pasteToWord()

    Dim activeMailMessage As Outlook.MailItem 'variable for email that will be copied.
    Dim activeBody
    Dim clearIt As String 'Intended to eventually clear clipboard.

'Code to get to the body of the active email.
    If TypeName(ActiveExplorer.Selection.Item(1)) = "MailItem" Then _
    Set activeMailMessage = ActiveExplorer.Selection.Item(1)
    activeBody = activeMailMessage.Body
    'MsgBox activeBody
    '^This displayed what I want in plaintext form,
    'so I think im on the right track

'Code to copy selection to clipboard

'Code to open new Word doc
    Set WordApp = CreateObject("Word.Application")
    WordApp.Documents.Add
    WordApp.Visible = True

'Code to paste contents of clipboard to active word document

'Code to clear clipboard

End Sub

任何填写上述空白的指导将不胜感激。

编辑:

感谢 David Zemens,这是迄今为止最接近的内容。我想我错过了一些参考,因为我的编译器不理解 ClearClipboard() 函数的“DataObject”。它确实复制并粘贴到带有格式的单词中,如下所示(尽管我不得不注释掉最后一个函数以避免错误):

Sub pasteToWord()

    Dim WordApp As Word.Application  'Need to link Microsoft Word Object library
    Dim wdDoc As Word.Document       'for these to be understood by compiler
    Dim activeMailMessage As Outlook.MailItem
    Dim activeBody As String

If TypeName(ActiveExplorer.Selection.Item(1)) = "MailItem" Then

    'Get a handle on the email
    Set activeMailMessage = ActiveExplorer.Selection.Item(1)

    'Ensure Word Application is open
    Set WordApp = CreateObject("Word.Application")

    'Make Word Application visible
    WordApp.Visible = True

    'Create a new Document and get a handle on it
    Set wdDoc = WordApp.Documents.Add

    'Copy the formatted text:
    activeMailMessage.GetInspector().WordEditor.Range.FormattedText.Copy

    'Paste to the word document
    wdDoc.Range.Paste

    'Clear the clipboard entirely:
     Call ClearClipBoard

End If

End Sub

Public Sub ClearClipBoard()
    Dim oData As New DataObject 'object to use the clipboard -- Compiler error, 
                                'I think I'm missing a reference here.

    oData.SetText Text:=Empty 'Clear
    oData.PutInClipboard 'take in the clipboard to empty it
End Sub

【问题讨论】:

【参考方案1】:

此方法将复制所选邮件项中的格式化文本,并将其粘贴到word文档中:

Dim WordApp As Word.Application
Dim wdDoc As Word.Document
Dim activeMailMessage As MailItem

If TypeName(ActiveExplorer.Selection.Item(1)) = "MailItem" Then

    'Get a handle on the email
    Set activeMailMessage = ActiveExplorer.Selection.Item(1)

    'Ensure Word Application is open
    Set WordApp = CreateObject("Word.Application")

    'Make Word Application visible
    WordApp.Visible = True

    'Create a new Document and get a handle on it
    Set wdDoc = WordApp.Documents.Add

    'Copy the formatted text:
    activeMailMessage.GetInspector().WordEditor.Range.FormattedText.Copy

    'Paste to the word document
    wdDocument.Range.Paste

    'Clear the clipboard entirely:
     Call ClearClipBoard

End If

注意使用function like the one described here 可以很容易地完全清除剪贴板:

Public Sub ClearClipBoard() 
    Dim oData   As New DataObject 'object to use the clipboard

    oData.SetText Text:=Empty 'Clear
    oData.PutInClipboard 'take in the clipboard to empty it
End Sub 

【讨论】:

您好,谢谢!即使 Word 已经打开,第一行也很好用。第二次尝试不起作用,它给了我:错误'91',对象变量或未设置块变量。我试着说“设置 wdDoc.Range.Text = activeBody”但同样的错误。尽管解决方案#1存在一个问题,但所有格式都消失了。有什么办法保存吗?我能够使用“activeBody = activeMailMessage.HTMLBody”来获取 HTML 格式,但我认为使用“WordApp.Documents(1).Range.Text = activeBody”会杀死它。我想我需要用实际存在的“FormatedText”之类的东西替换“Text”。 不,你是对的,它确实有效,我搞砸了复制粘贴。关于维护格式的任何想法?我尝试将“wdDoc.Range.Text = activeBody”替换为“wdDoc.Range.FormattedText = activeBody”,当我将 activeBody 设置为 Body 或 HTMLBody 时出现错误 13:类型不匹配。 好的,我会试一试,然后告诉你。我浏览了 MailItem 属性列表并尝试了 BodyRTF,它也不起作用(即使在尝试使用 Unicode 的 StrConv() 之后也是如此。我还使用了 BodyFormat 属性,这证实了我们所知道的,即正文是 html,但我不能找不到将 HTML 转换为可用内容的任何函数。即使将输出保存为 .HTML 也无济于事。 哦,绝对的,我真的不明白我在做什么,我只是在做并试图在此过程中获得理解。这种方法的优点或缺点是有争议的,但我不是计算机科学家,也不打算深入了解 VBA,只是想让这个东西工作。我也非常感谢您的帮助。请参阅我对初始帖子的修订。从那以后,我找到了我为 Word.x 对象缺少的库,但没有它们也可以工作...... FWIW,我试图将正文作为 rtf (activeBody = activeMailMessage.RTFBody) 然后对其进行编码,以便按照以下示例进行格式化:msdn.microsoft.com/en-us/library/office/… 但我无法桥接差距。我应该说我对我正在做的一些事情有一个基本的了解哈哈哈,但肯定不是完全掌握 VBA 的基础知识。【参考方案2】:

您可以在处理项目主体时使用 Word 对象模型。

Word 在 Outlook 中用作电子邮件编辑器。 Inspector 类的 WordEditor 属性从 Word 对象模型返回 Document 类的实例,该实例代表您的电子邮件正文。有关更多信息,请参阅Chapter 17: Working with Item Bodies。

如您所见,无需使用任何额外的工具或类(剪贴板等)。您可以使用内置机制复制文档或按原样保存文档。

【讨论】:

酷,谢谢。我从中了解了 BodyHTML(见上面的评论),但对于像我这样的新手来说,它已经很深入了,所以我将尝试更慢地阅读它,看看我是否能从中得到更多。

以上是关于使用 VBA 宏选择和复制 Outlook 电子邮件正文的主要内容,如果未能解决你的问题,请参考以下文章

VBA Outlook SendUsingAccount 不返回任何内容

通过 Outlook 中的宏写入电子邮件添加默认电子邮件签名

尽管有信任中心设置和数字签名,但 Outlook 2010 中的 VBA 宏突然被禁用?

由于 Windows 之前冻结,Outlook 宏已禁用

在 Excel 中使用 VBA,如何在 Outlook 中粘贴表格然后将表格转换为文本?

Excel VBA:如何在 Outlook 中向组发送电子邮件?