Pregunta

¿Cómo copio un correo electrónico en el portapapeles y luego pegarlo en Excel con las tablas intacta?

Se utiliza Outlook 2007 y quiero hacer el equivalente a

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

tengo el objeto de Excel Modelo bastante bien resuelto, pero tienen no experiencia en Outlook que no sea el siguiente código.

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)
¿Fue útil?

Solución

he de reconocer que utilizo esto en Outlook 2003, pero por favor ver si funciona en el año 2007, así:

puede utilizar el MSForms.DataObject para intercambiar datos con el portapapeles. En Outlook VBA, crear una referencia a " Microsoft Forms 2.0 Object Library ", y tratar de este código (por supuesto puede adjuntar el Sub () a un botón, etc.):

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

Después de eso, cambie a Excel y pulse Ctrl-V - Aquí vamos! Si también quiere encontrar la aplicación Excel se está ejecutando actualmente y automatizar incluso esto, que me haga saber.

Siempre hay un HTMLBody válida, aun cuando el correo se envía en texto sin formato o RTF y Excel mostrará todos los atributos de texto transmitidos dentro HTMLBody incl. columnas, colores, fuentes, hipervínculos, guiones, etc. Sin embargo, las imágenes incrustadas no se copian.

Este código muestra los elementos esenciales, pero no comprueba si realmente se ha seleccionado un MailItem. Esto requeriría más de codificación, si desea hacer que funcione para las entradas de calendario, contactos, etc., así.

Es suficiente si se ha seleccionado el correo en la vista de lista, que no necesita ni siquiera abrirlo.

Otros consejos

I finalmente lo recogió de nuevo y completamente automatizado ella. Aquí están los fundamentos de lo que hice para automatizarlo.

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

Me quita las direcciones URL logo para ahorrar tiempo , y cuando usted está tratando con 300 mensajes de correo electrónico, por lo que se traduce en menos de diez minutos guardan.

Me dieron el código que necesita de un artículo TechRepublic , y después se cambió para que se adapte a mis necesidades. Muchas gracias a quien responde aceptada de esta pregunta por el código portapapeles.

La autorización así que voy a tener que hacer ciertas suposiciones porque no hay información que falta de su pregunta. En primer lugar usted no dijo lo mailformat el mensaje es ... HTML sería el más fácil, el proceso será diferente para RTF y no es posible en texto plano Dado que usted se refiere a las tablas voy a suponer que son las tablas HTML y el formato de correo es HTML.

Además, no está claro de su pregunta si desea que el contenido de la tabla pegada por separado (1 célula por célula excel tabla) y el resto de los mensajes de correo electrónico bodyText pegar en 1 celda o varias?

Finalmente usted no ha dicho realmente si desea que el VBA que va desde Outlook o Excel (no tan importante pero afecta a la cual los objetos intrínsecos están disponibles.

De todos modos ejemplo de código: código de Outlook para el acceso al HTMLBody prop

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.

Después de un tiempo nuevo, he encontrado otra manera. MailItem.Body es texto plano, y tiene un carácter de tabulación entre celdas de la tabla. Así que he usado eso. Esta es la esencia de lo que hice:

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

media: 77 mensajes de correo electrónico procesado por segundo. Hago un poco de procesamiento menor y la extracción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top