E-Mail-Automatisierung: Extrahieren von Tabellendaten aus Outlook und Übertragen in Excel

Outlook VBA

Die Automatisierung täglicher Routineaufgaben kann eine erhebliche Zeitersparnis darstellen und die Produktivität erheblich steigern. Wenn Sie häufig mit Daten in E-Mails in tabellarischer Form umgehen müssen, könnte das Kopieren dieser Daten in ein Excel-Arbeitsblatt eine dieser zeitaufwändigen Aufgaben sein. Insbesondere wenn Sie Outlook verwenden und die E-Mails automatisch analysieren und die Daten extrahieren möchten, sobald sie eintreffen.

In diesem Artikel werden wir uns auf den Prozess konzentrieren, wie man ein Outlook VBA-Makro erstellt, das die E-Mail-Inhalte durchsucht, spezifisch nach Tabellendaten, und diese Daten dann automatisch in ein Excel-Arbeitsblatt überträgt. Dies wird besonders nützlich sein, wenn Sie ständig Daten aus E-Mails in Excel übertragen müssen. Wir werden den Code Schritt für Schritt durchgehen und erklären, wie Sie ihn an Ihre spezifischen Anforderungen anpassen können. Am Ende dieses Artikels werden Sie über die notwendigen Kenntnisse verfügen, um diese Art von Automatisierung selbst einzurichten und Ihren Arbeitsalltag zu vereinfachen.”

 

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)

Dieser Code definiert eine Subroutine, die ausgeführt wird, wenn eine neue E-Mail in Outlook eintrifft. `EntryIDCollection` ist eine durch Kommas getrennte Liste der Eintrags-IDs der neuen E-Mails.

Dim varEntryIDs
Dim objMail
Dim strEntryID As String
Dim objHTML As MSHTML.HTMLDocument
Dim objTable As MSHTML.IHTMLElement

Hier werden die Variablen deklariert, die in der Subroutine verwendet werden. `varEntryIDs` ist ein Array, das die einzelnen Eintrags-IDs enthält. `objMail` ist ein MailItem-Objekt, das die gerade bearbeitete E-Mail darstellt. `strEntryID` ist eine temporäre Variable, die die gerade bearbeitete Eintrags-ID enthält. `objHTML` ist ein HTMLDocument-Objekt, das verwendet wird, um den HTML-Inhalt der E-Mail zu analysieren. `objTable` ist ein IHTMLElement-Objekt, das die erste Tabelle im E-Mail-Inhalt repräsentiert.

 

Buchtipp Outlook VBA

Lernen Sie noch mehr, mit unserem Outlook VBA Buch, Jetzt bestellen.

varEntryIDs = Split(EntryIDCollection, ",")

Die Funktion `Split` teilt die `EntryIDCollection` in einzelne IDs auf und speichert diese in dem Array `varEntryIDs`.

For i = 0 To UBound(varEntryIDs)

Dies beginnt eine Schleife, die jede Eintrags-ID in `varEntryIDs` durchläuft.

strEntryID = varEntryIDs(i)
Set objMail = Application.Session.GetItemFromID(strEntryID)

Die gerade bearbeitete Eintrags-ID wird in `strEntryID` gespeichert, und das entsprechende MailItem-Objekt wird in `objMail` gespeichert.

Set objHTML = New MSHTML.HTMLDocument
With objHTML
.body.innerHTML = objMail.HTMLBody
Set objTable = .getElementsByTagName("table")(0)
Call CopyTableToExcel(objTable)
End With

Ein neues HTMLDocument-Objekt wird erstellt und der HTML-Inhalt der E-Mail wird hineinkopiert. Dann wird die erste Tabelle im HTML-Inhalt gefunden und in `objTable` gespeichert. Schließlich wird die Subroutine `CopyTableToExcel` aufgerufen, die die Tabelle in ein Excel-Arbeitsblatt kopiert.

Next
End Sub

Dies beendet die Schleife und die Subroutine.

Die nächste Subroutine, `CopyTableToExcel`, nimmt ein IHTMLElement-Objekt als Parameter und kopiert seine Inhalte in ein neues Excel-Arbeitsblatt.

Sub CopyTableToExcel(objTable)
Dim objExcelApp As Excel.Application
Dim objExcelWorkbook As Excel.Workbook
Dim objExcelWorksheet As Excel.Worksheet
Dim objRow As MSHTML.IHTMLElement
Dim objCell As MSHTML.IHTMLElement
Dim intRow As Integer
Dim intColumn As Integer

Die hier deklarierten Variablen repräsentieren die Excel-Anwendung, das neue Arbeitsbuch, das neue Arbeitsblatt und die aktuell bearbeitete Zeile und Zelle in der Tabelle.

Set objExcelApp = New Excel.Application
Set objExcelWorkbook = objExcelApp.Workbooks.Add
Set objExcelWorksheet = objExcelWorkbook.Sheets(1)
intRow = 1

Eine neue Instanz der Excel-Anwendung wird erstellt, ein neues Arbeitsbuch wird hinzugefügt und das erste Arbeitsblatt wird in `objExcelWorksheet` gespeichert. `intRow` wird auf 1 gesetzt, da die Tabelle in der ersten Zeile des Arbeitsblatts beginnen soll.

For Each objRow In objTable.getElementsByTagName("tr")
intColumn = 1
For Each objCell In objRow.Children
objExcelWorksheet.Cells(intRow, intColumn).Value = objCell.innerText
intColumn = intColumn + 1
Next objCell
intRow = intRow + 1
Next objRow

Dieser Code durchläuft jede Zeile und jede Zelle der Tabelle und kopiert den Textinhalt der Zelle in die entsprechende Zelle im Excel-Arbeitsblatt.

objExcelApp.Visible = True
objExcelWorkbook.SaveAs "Pfad\zur\Ihrer\Datei.xlsx"
Set objMail = Nothing
Set objHTML = Nothing
End Sub

Abschließend wird die Excel-Anwendung sichtbar gemacht und das Arbeitsbuch wird gespeichert. Schließlich werden die Objektvariablen auf `Nothing` gesetzt, um Speicher freizugeben.

 

Hier der gesamte Code:

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim varEntryIDs
Dim objMail
Dim strEntryID As String
Dim objHTML As MSHTML.HTMLDocument
Dim objTable As MSHTML.IHTMLElement
varEntryIDs = Split(EntryIDCollection, ",")
For i = 0 To UBound(varEntryIDs)
strEntryID = varEntryIDs(i)
Set objMail = Application.Session.GetItemFromID(strEntryID)
Set objHTML = New MSHTML.HTMLDocument
With objHTML
.body.innerHTML = objMail.HTMLBody
Set objTable = .getElementsByTagName("table")(0)
Call CopyTableToExcel(objTable)
End With
Next
End Sub

Sub CopyTableToExcel(objTable)
Dim objExcelApp As Excel.Application
Dim objExcelWorkbook As Excel.Workbook
Dim objExcelWorksheet As Excel.Worksheet
Dim objRow As MSHTML.IHTMLElement
Dim objCell As MSHTML.IHTMLElement
Dim intRow As Integer
Dim intColumn As Integer
Set objExcelApp = New Excel.Application
Set objExcelWorkbook = objExcelApp.Workbooks.Add
Set objExcelWorksheet = objExcelWorkbook.Sheets(1)
intRow = 1
For Each objRow In objTable.getElementsByTagName("tr")
intColumn = 1
For Each objCell In objRow.Children
objExcelWorksheet.Cells(intRow, intColumn).Value = objCell.innerText
intColumn = intColumn + 1
Next objCell
intRow = intRow + 1
Next objRow
objExcelApp.Visible = True
objExcelWorkbook.SaveAs "Pfad\zur\Ihrer\Datei.xlsx"
Set objMail = Nothing
Set objHTML = Nothing
End Sub

Bitte ersetzen Sie "Pfad\zur\Ihrer\Datei.xlsx" mit dem tatsächlichen Pfad und Dateinamen, unter dem Sie das Excel-Workbook speichern möchten. Dieses Makro erstellt eine neue Excel-Datei jedes Mal, wenn eine neue E-Mail ankommt. Wenn Sie stattdessen Daten zu einer bestehenden Datei hinzufügen möchten, müssen Sie den Code entsprechend anpassen.

Bitte beachten Sie, dass Sie in Outlook den automatischen Start von Makros erlauben müssen. Wie bei allen VBA-Makros kann auch dieser Code unerwartete Ergebnisse liefern, wenn die Daten nicht dem erwarteten Format entsprechen. Testen Sie es daher sorgfältig und stellen Sie sicher, dass Sie verstehen, was der Code tut, bevor Sie ihn in einer Produktionsumgebung einsetzen.

 

-

Vorheriger Artikel Nächster Artikel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

CAPTCHA eingeben * Das Zeitlimit ist erschöpft. Bitte CAPTCHA neu laden.