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

4
我是一个Excel VBA宏的初学者,在Outlook中进行第一次尝试,以下是我正在尝试完成的内容:
在Outlook 2010中,将宏分配给按钮,当按下该按钮时,
  1. 获取活动电子邮件的整个正文
  2. 复制包括所有格式和HTML在内的正文到剪贴板上
  3. 打开新的Word文档
  4. 将剪贴板的内容粘贴到该Word文档中
  5. 清空剪贴板
到目前为止,我只完成了步骤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”。虽然如下所示可以复制和粘贴带有格式的内容到Word中(尽管我必须注释掉最后一个函数以避免错误):
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
2个回答

4

这个方法会从选定的邮件项中复制格式化文本,并将其粘贴到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

注意:可以使用类似此处描述的函数轻松地完全清除剪贴板:

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 

第二种方法不应该出现任何错误,我刚刚仔细检查过了。您能否请修改您的问题,以展示您当前正在使用/尝试使用的代码? - David Zemens
1
不,你说得对,它确实可以工作,我复制粘贴时搞砸了。有什么关于保持格式的想法吗?我尝试用“wdDoc.Range.FormattedText = activeBody”替换“wdDoc.Range.Text = activeBody”,但当我将activeBody设置为Body或HTMLBody时,会出现错误13:类型不匹配。 - AnthonyJS
1
好的,我会尝试并告诉您结果。我查看了 MailItem 属性列表,并尝试了BodyRTF,即使尝试了使用 Unicode 的 StrConv() 也无法正常工作。我还使用了 BodyFormat 属性,确认了我们所知道的,即正文是 HTML,但我找不到任何将 HTML 转换为可用内容的函数。即使将输出保存为 .HTML,也没有帮助。 - AnthonyJS
1
哦,绝对的,我真的不太明白我在做什么,我只是在尝试并试图在路上获得理解。这种方法的优点或缺点有争议,但我不是计算机科学家,也不打算需要深入了解VBA,只是想让这个东西工作。我非常感谢你的帮助。请看一下我对最初帖子的修订。我后来找到了我缺少的Word.x对象库,但没有它们也可以工作... - AnthonyJS
1
顺便说一句,我试图获取rtf格式的正文(activeBody = activeMailMessage.RTFBody),然后按照这里的示例进行编码,以便它看起来是格式化的:http://msdn.microsoft.com/en-us/library/office/ff867828%28v=office.14%29.aspx,但我无法弥合差距。我应该说我对自己正在做的事情有基本的理解哈哈哈,但肯定没有完全掌握VBA的基础知识。 - AnthonyJS
显示剩余4条评论

0

处理邮件正文时,可以使用Word对象模型。

在Outlook中,Word用作电子邮件编辑器。 Inspector类的WordEditor属性从Word对象模型返回Document类的实例,该实例代表您的电子邮件正文的Body。有关更多信息,请参见第17章:处理项目正文

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


太棒了,谢谢你。我从中了解到了BodyHTML(请参见上面的评论),但对于像我这样的新手来说,它还是太深入了,所以我打算慢慢阅读并看看是否能从中获得更多收获。 - AnthonyJS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接