Outlook-Workshop - Email aus Word/Excel erstellen Teil 1

In den nächsten 4 Teilen lernen wir, wie man eine Email aus Excel oder Word heraus erstellen kann.

Im ersten Teil wird eine einfache Email mit Anhang erstellt.

Für alle die auch mal größere Text formatieren wollen/müssen und dabei ein optisch übersichtlichen VBA-Code haben möchten. Zuviele HTML-Tags im "Body-Text" machen den Code schnell unleserlich. An alle diese Anwender richten sich die Teile 2 und 3.

Im zweiten Teil werden wir die Textgröße und die Schriftart anpassen.
Im dritten Teil widmen wir uns dem Anpassen einzelner Wörter. Dabei passen wir die Schriftfarbe und den Schrifttyp an. Der Beispielcode bezieht sich immer auf Excel.
Im vierten Teil werden wichtige Parameter erklärt und mit einer Beispielzeile versehen.
-----------------------------


Kurze Einführung:

Zum Erstellen eines Email-Objektes gibt es zwei Möglichkeiten, Early-Binding und Late-Binding.

Bei Early-Binding wird ein permanenter Verweis auf die Outlook-Objektlibrary gesetzt. Diese Methode ist jedoch aufgrund verschiedener "technischer Probleme" bei Weitergabe der Datei nicht zu empfehlen.

Bei Late-Binding wird zur Laufzeit der Prozedur ein temporäres Outlook-Objekt erstellt, welches nach Ablauf der Prozedur wieder beendet wird. Late-Binding ist, wann immer es möglich ist, vorzuziehen.

Wir bedienen uns in diesem Workshop der Late-Binding-Methode.
-----------------------------


Grundsätzliches:
Die Formatierung von Emails funktioniert nur mit HTML-Mails. Bedenken Sie bitte dass nicht jede(r) Empfänger(in) HTML-Mails lesen kann/darf. In solchen Fällen hat die Formatierung keine Wirkung. Setzen Sie daher die Formatierung bitte nur ein wenn Sie sicher sind dass der/die Empfänger(in) HTML-Mails lesen kann/darf.
-----------------------------


Kommen wir nun zum Erstellen einer einfachen unformatierten Email.

Im ersten Beispiel wird eine Email erstellt und als Anhang die aktive Arbeitsmappe gesendet. Die Email wird im HTML-Format erstellt.

Option Private Module
Option Explicit

Public Sub EinfacheMailMitAnhang()

Dim olApp     As Object
Dim AWS       As String
Dim olOldbody As String


ActiveWorkbook.Save
AWS = ActiveWorkbook.FullName

Set olApp = CreateObject("Outlook.Application")

    With olApp.CreateItem(0)
              .GetInspector.Display
              olOldbody = .htmlBody
              .To = "testserver.de"
              .Subject = "Test"
              .htmlBody = "Hallo!<br><br>Anbei gewünschte Informationen.<br><br>" & _
                          "Ihre Auftragsnummer lautet " & Range("A1") & _
                          "<br><br>Gruß,<br>Max<br><br>" & olOldbody
              .Attachments.Add AWS
    End With

End Sub



Im zweiten Beispiel wird zusätzlich zum Anhang ein Tabellenausschnitt in den HTML-Body eingefügt. Es wird der Bereich A1:H10 eingefügt. Damit der Tabellenausschnitt im Body eingefügt werden kann, benötigen wir eine zusätzliche Funktion, die Sie bitte nicht ändern.

Option Private Module
Option Explicit

Sub EinfacheEmailMitZellinhalt()

Dim olApp     As Object
Dim AWS       As String
Dim olOldbody As String


ActiveWorkbook.Save
AWS = ActiveWorkbook.FullName

Set olApp = CreateObject("Outlook.Application")

    With olApp.CreateItem(0)
              .GetInspector.Display
              olOldbody = .htmlBody
              .To = "testserver.de"
              .Subject = "Test"
              .htmlBody = "Hallo!<br><br>Anbei gewünschte Informationen.<br><br>" & _
                          RangeToHTML(Range("A1:H10")) & _
                          "<br><br>Gruß,<br>Max<br><br>" & olOldbody
              .Attachments.Add AWS 
    End With

End Sub

Rem Funktion zum Umwandeln eines Zellbereiches in HTML 
Function RangeToHTML(rng As Range)
    Dim Fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim TempWB As Workbook
TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
    rng.Copy
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        .Cells(1).Select
        Application.CutCopyMode = False
        On Error GoTo 0
    End With
    With TempWB.PublishObjects.Add( _
         SourceType:=xlSourceRange, _
         Filename:=TempFile, _
         Sheet:=TempWB.Sheets(1).Name, _
         Source:=TempWB.Sheets(1).UsedRange.Address, _
         HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set ts = Fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangeToHTML = ts.readall
    ts.Close
    RangeToHTML = Replace(RangeToHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")
    TempWB.Close savechanges:=False
    Kill TempFile
    Set ts = Nothing
    Set Fso = Nothing
    Set TempWB = Nothing
End Function