Скопируйте электронное письмо в буфер обмена с помощью Outlook VBA

StackOverflow https://stackoverflow.com/questions/3949918

Вопрос

Как мне скопировать электронное письмо в буфер обмена, а затем вставить его в Excel с сохранением таблиц?

Я использую Outlook 2007, и я хочу сделать эквивалент

"Click on email > Select All > Copy > Switch to Excel > Select Cell > Paste". 

У меня есть объектная модель Excel, которая довольно хорошо проработана, но есть НЕТ опыт работы с Outlook, отличным от приведенного ниже кода.

Dim mapi As NameSpace
Dim msg As Outlook.MailItem
Set mapi = Outlook.Application.GetNamespace("MAPI")
Set msg = mapi.Folders.Item(1).Folders.Item("Posteingang").Folders.Item(1).Folders.Item(7).Items.Item(526)
Это было полезно?

Решение

Я должен признать, что использую это в Outlook 2003, но, пожалуйста, посмотрите, работает ли это и в 2007:

вы можете использовать MSForms.Объект данных для обмена данными с буфером обмена.В Outlook VBA создайте ссылку на "Библиотека объектов Microsoft Forms 2.0", и попробуйте этот код (вы, конечно, можете прикрепить Sub() к кнопке и т.д.):

Sub Test()
Dim M As MailItem, Buf As MSForms.DataObject

    Set M = ActiveExplorer().Selection.Item(1)
    Set Buf = New MSForms.DataObject
    Buf.SetText M.HTMLBody
    Buf.PutInClipboard

End Sub

После этого переключитесь в Excel и нажмите Ctrl-V - поехали!Если вы также хотите найти запущенное в данный момент приложение Excel и автоматизировать даже это, дайте мне знать.

Всегда есть допустимое HTMLBody, даже если письмо было отправлено в виде обычного текста или RTF, и Excel отобразит все текстовые атрибуты, переданные в HTMLBody, включая.столбцы, цвета, шрифты, гиперссылки, отступы и т.д.Однако встроенные изображения не копируются.

Этот код демонстрирует основные элементы, но не проверяет, действительно ли выбран почтовый элемент.Это потребовало бы дополнительного кодирования, если вы хотите, чтобы оно работало для записей календаря, контактов и т.д.также хорошо.

Достаточно, если вы выбрали почту в виде списка, вам даже не нужно ее открывать.

Другие советы

Наконец я снова выбрал его и полностью автоматизировал его. Вот основные основы того, что я сделал, чтобы автоматизировать его.

Dim appExcel As Excel.Application
Dim Buf As MSForms.DataObject
Dim Shape As Excel.Shape
Dim mitm As MailItem
Dim itm As Object
Dim rws As Excel.Worksheet
'code to open excel
Set appExcel = VBA.GetObject(, "Excel.Application") 
'...
'code to loop through emails here       
Set mitm = itm
body = Replace(mitm.HTMLBody, "http://example.com/images/logo.jpg", "")
Call Buf.SetText(body)
Call Buf.PutInClipboard
Call rws.Cells(i, 1).PasteSpecial
For Each Shape In rws.Shapes
    Shape.Delete 'this deletes the empty shapes
Next Shape
'next itm

Я удалил URL-адреса логотипа сэкономить время, И когда вы имеете дело с 300 писем, что переводит как минимум десять минут.

Я получил код, который мне нужен от Техрепичная статья, а затем изменил его в соответствии с моими потребностями. Большое благодаря принятому ответчику этого вопроса для кода буфера обмена.

Хорошо, поэтому мне придется принять определенные предположения, потому что есть информация от вашего вопроса. Во-первых, вы не сказали, что MailFormat сообщение ... HTML будет самым простым, процесс будет отличаться для RTF и невозможно в открытом тексте, поскольку вы ссылаетесь на таблицы, я предполагаю, что они являются таблицами HTML, а формат почты HTML.

Также от вашего вопроса неясно, если вы хотите, если вы хотите, чтобы содержимое таблицы вставленное отдельно (1 ячейку Excel на таблицу), а остальные электронные письма Bodytext вставляются в 1 ячейку или несколько?

Наконец, вы на самом деле не сказали, если вы хотите, чтобы VBA запустить из Outlook или Excel (не так важно, но это влияет на то, какие внутренние объекты доступны.

В любом случае образец кода: Automook Code для доступа к HTML-связи

Dim mapi As Namespace
Set mapi = Application.Session
Dim msg As MailItem
Set msg = mapi.Folders.Item(1).Folders.Item("Posteingang").Folders.Item(1).Folders.Item(7).Items.Item(526) 
Dim strHTML as String
strHTML = msg.HTMLBody
' There is no object model collection for html tables within the htmlbody (which is a string of html) you will need to parse the html and collect the tables before inserting into Excel.

Через некоторое время я нашел другой путь. MailiTem.body - это простой текст и имеет символ вкладок между клетками таблиц. Так что я использовал это. Вот суть того, что я сделал:

Sub Import()
    Dim itms As Outlook.Items
    Dim itm As Object
    Dim i As Long, j As Long
    Dim body As String
    Dim mitm As Outlook.MailItem
    For Each itm In itms
        Set mitm = itm
        ParseReports (mitm.body) 'uses the global var k
    Next itm
End Sub
Sub ParseReports(text As String)
    Dim table(1 To 1000, 1 To 11) As String 'I'm not expecting to see a thousand rows!
    Dim drow(1 To 11) As String
    For Each Row In VBA.Split(text, vbCrLf)
        j = 1
        For Each Col In VBA.Split(Row, vbTab)
            table(i, j) = Col
            j = j + 1
        Next Col
        i = i + 1
    Next Row
    For i = 1 To l
        For j = 1 To 11
            drow(j) = table(i, j)
        Next j
        hws.Range(hws.Cells(k, 1), hws.Cells(k, 11)) = drow
        k = k + 1
    Next i
End Sub

Среднее: 77 электронных писем обработанный в секунду. Я делаю небольшую обработку и извлечение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top