Frage

Wie kopiere ich eine E-Mail in die Zwischenablage und anschließend in Excel einfügen mit den Tabellen intakt?

Ich bin mit Outlook 2007 und ich möchte das Äquivalent tun

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

Ich habe das Excel-Objektmodell ziemlich gut herausgefunden, haben aber nicht Erfahrung in Outlook anderen als den folgenden Code.

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)
War es hilfreich?

Lösung

Ich muss zugeben, dass ich diese verwenden in Outlook 2003, aber bitte sehen, ob es auch 2007 funktioniert:

können Sie die MSForms.DataObject für den Datenaustausch mit der Zwischenablage verwenden. In Outlook VBA einen Verweis erstellen " Microsoft Forms 2.0 Object Library ", und versuchen Sie diesen Code (Sie natürlich die Sub anhängen können () auf eine Schaltfläche, usw.):

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

Danach wechseln Sie in Excel und drücken Sie Strg-V - da gehen wir! Wenn Sie auch die aktuell laufenden Excel Anwendung finden wollen und automatisieren, auch diese, lassen Sie es mich wissen.

Es gibt immer einen gültigen Htmlbody, auch wenn die Post in Plain Text oder RTF gesendet wurde, und Excel werden alle Textattribute innerhalb Htmlbody inkl befördert anzuzeigen. Spalten, Farben, Schriftarten, Hyperlinks, Einzüge usw. Jedoch eingebettete Bilder werden nicht kopiert.

Dieser Code zeigt das Wesentliche, aber prüft nicht, ob wirklich ein MailItem ausgewählt ist. Dies würde erfordern mehr Codierung, wenn Sie wollen es für Kalendereinträge machen arbeiten, Kontakte usw. auch.

Es ist genug, wenn Sie die E-Mail in der Listenansicht ausgewählt haben, brauchen Sie nicht einmal zu öffnen.

Andere Tipps

Ich hob es schließlich wieder auf und vollständig automatisiert es. Hier sind die Grundlagen dessen, was habe ich es zu automatisieren.

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

entfernte ich das Logo Urls Zeit zu speichern, und wenn man es zu tun mit 300 E-Mail, die in übersetzt in mindestens 10 Minuten gespeichert.

Ich habe den Code, den ich brauchte von ein TechRepublic Artikel , und dann änderte meine Bedürfnisse anzupassen. Vielen Dank an den akzeptierten Beantworter dieser Frage für den Zwischenablage-Code.

Ok, damit ich bestimmte Annahmen machen, weil es Informationen aus Ihrer Frage fehlen. Zum einen haben Sie gesagt nicht, was die Botschaft ist ... Mailformat HTML wäre die einfachste, wird der Prozess für RTF verschieden sein können und nicht in Klartext Da Sie auf Tabellen beziehen sind nehme ich an, sind sie HTML-Tabellen und das E-Mail-Format HTML.

Auch ist es nicht von Ihrer Frage zu klären, ob Sie den Tabelleninhalt wollen separat geklebt (1 Excel-Zelle pro Tabellenzelle) und der Rest der E-Mails in 1 Bodytext Zelle eingefügt oder mehr?

schließlich haben Sie nicht wirklich gesagt, wenn Sie wollen, dass die VBA von Outlook ausgeführt wird oder Excel (nicht so wichtig, aber es wirkt sich die intrinsische Objekte stehen zur Verfügung.

Wie dem auch sei Codebeispiel: Outlook-Code den Zugriff auf die 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.

Nach einer Weile wieder, fand ich eine andere Art und Weise. MailItem.Body ist Klartext, und hat ein Tabulatorzeichen zwischen Tabellenzellen. So habe ich das. Hier ist der Kern dessen, was ich getan habe:

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

Durchschnitt: 77 E-Mails bearbeitet pro Sekunde. Ich mache einige kleinere Verarbeitung und Extraktion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top