2015-01-12 4 views
0

Я новичок в VBA макросов в Excel, и это первая попытка в Outlook, но вот что я пытаюсь сделать:Выбор и копирование электронной почты Outlook тела с VBA макрос

В Outlook 2010, назначить макрос на кнопку, чтобы при нажатии,

  1. Получает все тело активной электронной почты
  2. копии тела, включая все форматирование и HTML в буфер обмена
  3. Открывает новое слово документ
  4. Вставляет содержимое буфера обмена в это слове документ
  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 

Любые указания по заполнению бланков, приведенных выше, будут высоко оценены.

Edit:

Вот что пришло ближе всего до сих пор, благодаря Дэвид Zemens. Я думаю, что мне не хватает ссылки, потому что мой компилятор не понимает «DataObject» для функции ClearClipboard(). Это скопировать и вставить в слова с форматированием, хотя, как ниже (хотя мне пришлось закомментировать последнюю функцию, чтобы избежать ошибок):

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

Этот метод будет копия форматированный текст из выбранного MailItem, и паста это, чтобы документ слова:

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 
+0

Здравствуйте, Спасибо за это! Первая строка отлично работает, даже если Word уже открыт. Эта вторая попытка не работает, она дает мне: ошибка '91', переменная объекта или с заблокированной переменной блока. Я попробовал сказать «Установить wdDoc.Range.Text = activeBody», но такую ​​же ошибку. Одна проблема, хотя с решением № 1 все форматирование исчезло. Любой способ сохранить его? Я смог использовать «activeBody = activeMailMessage.HTMLBody», чтобы получить форматирование HTML, но я думаю, что использование «WordApp.Documents (1) .Range.Text = activeBody» убивает его. Мне кажется, мне нужно заменить «Текст» на что-то вроде «FormatedText», который на самом деле существует. – AnthonyJS

+0

Второй метод не должен вызывать никаких ошибок, я просто дважды проверял.Не могли бы вы пересмотреть свой вопрос, чтобы показать код, который вы в настоящее время используете/пытаетесь использовать? –

+1

Нет, вы правы, это работает, я испортил копирование. Любые идеи по поддержке форматирования? Я попытался заменить «wdDoc.Range.Text = activeBody» на «wdDoc.Range.FormattedText = activeBody», и я получаю ошибку 13: несоответствие типа, как при установке activeBody на Body, так и в HTMLBody. – AnthonyJS

0

Вы можете использовать объектную модель Word при работе с предметными предметами.

Word используется в качестве редактора электронной почты в Outlook. Свойство WordEditor класса Inspector возвращает экземпляр класса Document из объектной модели Word, который представляет Тело вашего письма. См. Chapter 17: Working with Item Bodies для получения дополнительной информации.

Как вы можете видеть, нет необходимости использовать какие-либо дополнительные инструменты или классы (буфер обмена и т. Д.). Вы можете скопировать документ с помощью встроенных механизмов или сохранить документ как есть.

+0

Прохладный, спасибо за это. Я узнал о BodyHTML (см. Выше комментарий), но это довольно подробно для новичков, подобных мне, поэтому я собираюсь попытаться прочитать его медленнее и увидеть, если я получу от него что-нибудь еще. – AnthonyJS

Смежные вопросы