使用 VBA 宏选择和复制 Outlook 电子邮件正文
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27907811/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Selecting and copying Outlook email body with a VBA macro
提问by AnthonyJS
I'm a beginner to VBA macros in Excel, and this is the first attempt in Outlook, but here's what I am trying to do:
我是 Excel 中 VBA 宏的初学者,这是 Outlook 中的第一次尝试,但这是我想要做的:
In Outlook 2010, assign a macro to a button that, when pushed,
在 Outlook 2010 中,将宏分配给按钮,按下该按钮时,
- Gets the entire body of the active email
- Copies the body including all formatting and html to the clipboard
- Opens a new word document
- Pastes the content of the clipboard to this word doc
- Clears the clipboard
- 获取活动电子邮件的整个正文
- 将包含所有格式和 html 的正文复制到剪贴板
- 打开一个新的word文档
- 将剪贴板的内容粘贴到这个 word 文档
- 清除剪贴板
So far, all I have are steps 1 and 3 (and I wonder if I'm going about this the wrong way in step 1) below:
到目前为止,我所拥有的只是下面的第 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
Any guidance to fill in the blanks above would be much appreciated.
任何填写上述空白的指导将不胜感激。
Edit:
编辑:
Here is what has come the closest so far, thanks to David Zemens. I think I am missing some reference though, because my compiler doesn't understand "DataObject" for the ClearClipboard() function. It does copy and paste into word with formatting though, as is below (though I had to comment out the last function to avoid errors):
这是迄今为止最接近的,感谢大卫泽门斯。我想我缺少一些参考,因为我的编译器不理解 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
回答by David Zemens
This method will copythe formatted text from the selected mailitem, and pasteit in to word document:
此方法将从所选邮件项中复制格式化文本,并将其粘贴到 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
NOTEClearing the clipboard entirely can be done pretty easily with a 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
回答by Eugene Astafiev
You can use the Word object model when dealing woth item bodies.
在处理项目正文时,您可以使用 Word 对象模型。
Word is used as an email editor in Outlook. The WordEditorproperty of the Inspector class returns an instance of the Document class from the Word object model which represents the Body of your email. See Chapter 17: Working with Item Bodiesfor more information.
Word 在 Outlook 中用作电子邮件编辑器。Inspector 类的WordEditor属性从 Word 对象模型返回一个 Document 类的实例,它代表您的电子邮件的正文。有关详细信息,请参阅第 17 章:使用项目正文。
As you may see, there is no need to use any extra tools or classes (Clipboard and etc.). You can copy the document using built-in mechanisms or save the document as is.
如您所见,无需使用任何额外的工具或类(剪贴板等)。您可以使用内置机制复制文档或按原样保存文档。