Kopieren Sie E-Mail in die Zwischenablage mit Outlook VBA
-
08-10-2019 - |
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)
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.