Word-Dokument als Mailtext einfügen

Outlook VBA

Sie beantworten immer wieder ähnliche Anfragen und haben die passenden Texte längst als Word-Dokumente abgelegt? Statt jedes Mal Word zu öffnen, alles zu markieren und zu kopieren, holt dieses Makro den kompletten Inhalt eines Word-Dokuments direkt in Ihre Antwort oder in eine neue E-Mail. Formatierungen, Tabellen und Aufzählungen bleiben dabei erhalten.

1. Ziel des Makros

Das Makro besteht aus zwei Befehlen, die Sie über eine Schaltfläche oder Alt + F8 starten:

  • WordTextAlsAntwort erstellt eine Antwort auf die markierte oder geöffnete E-Mail und setzt den Inhalt eines Word-Dokuments an den Anfang des Nachrichtentextes, also über Ihre Signatur und den zitierten Originaltext.
  • WordTextAlsNeueMail öffnet eine neue E-Mail mit dem Inhalt des Dokuments. Ist noch kein Betreff eingetragen, wird der Dateiname als Betreff vorgeschlagen.

Das Dokument wählen Sie jeweils in einem normalen Dateidialog aus, der standardmäßig im Ordner Dokumente\Mailtexte startet. Die E-Mail wird nur angezeigt und nie automatisch gesendet. Sie können den Text also vor dem Versand noch anpassen.

2. Technische Umsetzung

Outlook verwendet für den Nachrichteneditor intern Word. Über Inspector.WordEditor erhält das Makro Zugriff auf das Word-Dokument, das hinter dem geöffneten Nachrichtenfenster steckt. Darauf lässt sich die Word-Methode Range.InsertFile anwenden, die eine Datei an einer bestimmten Stelle einfügt, genau so, als hätten Sie in Word Einfügen → Objekt → Text aus Datei gewählt.

Ablauf

  1. Das Makro ermittelt die markierte oder geöffnete E-Mail (nur bei der Antwort-Variante).
  2. Es erstellt die Antwort beziehungsweise eine neue E-Mail im HTML-Format und zeigt sie an. Erst ein angezeigtes Fenster stellt den Word-Editor zuverlässig bereit.
  3. Über den Dateidialog von Word wählen Sie das Dokument aus.
  4. Das Makro prüft, ob die Datei existiert, und fügt ihren Inhalt an Position 0 des Nachrichtentextes ein.

Kompatibilität

Der Code nutzt nur die Outlook-Objektbibliothek und spricht Word über späte Bindung (As Object) an. Sie müssen also keinen Verweis auf die Word-Bibliothek setzen. Es gibt keine Windows-API-Aufrufe; das Makro läuft daher unverändert in 32- und 64-Bit-Versionen von klassischem Outlook (Outlook 2016, 2019, 2021, 2024 und Microsoft 365). Das neue Outlook unterstützt keine VBA-Makros.

3. Vollständiger VBA-Code

Fügen Sie den folgenden Code in ein normales Modul ein (siehe Abschnitt 5). Den Startordner des Dateidialogs passen Sie bei Bedarf in der Funktion StartOrdner an.

Option Explicit

' Word-Dokument als Mailtext einfuegen
' Fuer klassisches Outlook unter Windows, 32 und 64 Bit.
' Word wird ueber spaete Bindung angesprochen, kein Verweis noetig.

Private Const DIALOG_DATEIAUSWAHL As Long = 3   ' msoFileDialogFilePicker
Private Const TITEL As String = "Word-Text einfuegen"

' Antwort auf die markierte oder geoeffnete E-Mail mit Word-Inhalt
Public Sub WordTextAlsAntwort()
    Dim original As Outlook.MailItem
    Dim antwort As Outlook.MailItem
    Dim pfad As String

    On Error GoTo Fehler
    Set original = AktuelleMail()
    If original Is Nothing Then
        MsgBox "Bitte zuerst eine E-Mail markieren oder oeffnen.", _
               vbInformation, TITEL
        Exit Sub
    End If

    Set antwort = original.Reply
    antwort.BodyFormat = olFormatHTML
    antwort.Display

    pfad = WordDateiWaehlen(antwort)
    If Len(pfad) = 0 Then Exit Sub   ' Abbruch: Antwort bleibt offen

    WordDateiEinfuegen antwort, pfad
    Exit Sub

Fehler:
    MsgBox "Fehler " & Err.Number & ": " & Err.Description, _
           vbExclamation, TITEL
End Sub

' Neue E-Mail mit Word-Inhalt
Public Sub WordTextAlsNeueMail()
    Dim neueMail As Outlook.MailItem
    Dim pfad As String

    On Error GoTo Fehler
    Set neueMail = Application.CreateItem(olMailItem)
    neueMail.BodyFormat = olFormatHTML
    neueMail.Display

    pfad = WordDateiWaehlen(neueMail)
    If Len(pfad) = 0 Then Exit Sub

    WordDateiEinfuegen neueMail, pfad
    If Len(Trim$(neueMail.Subject)) = 0 Then
        neueMail.Subject = DateinameOhneEndung(pfad)
    End If
    Exit Sub

Fehler:
    MsgBox "Fehler " & Err.Number & ": " & Err.Description, _
           vbExclamation, TITEL
End Sub

' Liefert die geoeffnete oder die erste markierte E-Mail, sonst Nothing
Private Function AktuelleMail() As Outlook.MailItem
    Dim element As Object

    On Error Resume Next
    Select Case TypeName(Application.ActiveWindow)
        Case "Inspector"
            Set element = Application.ActiveInspector.CurrentItem
        Case "Explorer"
            If Application.ActiveExplorer.Selection.Count > 0 Then
                Set element = Application.ActiveExplorer.Selection.Item(1)
            End If
    End Select
    On Error GoTo 0

    If Not element Is Nothing Then
        If TypeOf element Is Outlook.MailItem Then
            Set AktuelleMail = element
        End If
    End If
End Function

' Zeigt den Word-Dateidialog; liefert den Pfad oder "" bei Abbruch
Private Function WordDateiWaehlen(ByVal mail As Outlook.MailItem) As String
    Dim editor As Object
    Dim dialog As Object

    On Error GoTo Ersatz
    Set editor = mail.GetInspector.WordEditor
    Set dialog = editor.Application.FileDialog(DIALOG_DATEIAUSWAHL)

    With dialog
        .Title = "Word-Dokument fuer den Mailtext waehlen"
        .AllowMultiSelect = False
        .InitialFileName = StartOrdner()
        .Filters.Clear
        .Filters.Add "Word-Dokumente", "*.docx;*.docm;*.doc;*.rtf"
        If .Show = -1 Then WordDateiWaehlen = .SelectedItems(1)
    End With
    Exit Function

Ersatz:
    ' Falls der Dialog nicht verfuegbar ist: Pfad manuell eingeben
    WordDateiWaehlen = Trim$(InputBox( _
        "Vollstaendigen Pfad zum Word-Dokument eingeben:", _
        TITEL, StartOrdner()))
End Function

' Fuegt den Inhalt der Datei am Anfang des Nachrichtentextes ein
Private Sub WordDateiEinfuegen(ByVal mail As Outlook.MailItem, _
                               ByVal pfad As String)
    Dim editor As Object
    Dim einfuegestelle As Object

    pfad = Replace(pfad, """", "")
    If Len(Dir$(pfad)) = 0 Then
        Err.Raise vbObjectError + 1001, TITEL, _
                  "Die Datei wurde nicht gefunden: " & pfad
    End If

    Set editor = mail.GetInspector.WordEditor
    Set einfuegestelle = editor.Range(0, 0)
    einfuegestelle.InsertFile FileName:=pfad, ConfirmConversions:=False
End Sub

' Startordner des Dateidialogs: Dokumente\Mailtexte
Private Function StartOrdner() As String
    StartOrdner = Environ$("USERPROFILE") & "\Documents\Mailtexte\"
End Function

Private Function DateinameOhneEndung(ByVal pfad As String) As String
    Dim dateiname As String
    dateiname = Mid$(pfad, InStrRev(pfad, "\") + 1)
    If InStrRev(dateiname, ".") > 0 Then
        dateiname = Left$(dateiname, InStrRev(dateiname, ".") - 1)
    End If
    DateinameOhneEndung = dateiname
End Function

Die Programmstruktur wurde statisch geprüft. Testen Sie das Makro vor dem regelmäßigen Einsatz einmal mit einer E-Mail an sich selbst.

4. Code-Erklärung

ElementBedeutung
AktuelleMailPrüft, ob gerade ein Nachrichtenfenster (Inspector) oder die Ordneransicht (Explorer) aktiv ist, und liefert die passende E-Mail. Termine, Aufgaben oder Besprechungsanfragen werden ignoriert.
original.ReplyErzeugt die Antwort an den Absender. Für „Allen antworten“ ersetzen Sie Reply durch ReplyAll.
BodyFormat = olFormatHTMLStellt sicher, dass Formatierungen aus Word erhalten bleiben, auch wenn die ursprüngliche E-Mail als Nur-Text kam.
GetInspector.WordEditorLiefert das Word-Dokument hinter dem Nachrichtenfenster. Darüber erreicht das Makro auch die Word-Anwendung für den Dateidialog.
FileDialog(3)Der Dateiauswahldialog von Office. Outlook selbst bietet in VBA keinen eigenen Dateidialog, deshalb nutzt das Makro den von Word.
Range(0, 0)Eine leere Einfügestelle ganz am Anfang des Textes, also vor Signatur und Zitat.
InsertFileFügt den Inhalt der Datei ein. ConfirmConversions:=False unterdrückt die Rückfrage zur Formatkonvertierung, etwa bei RTF-Dateien.
Dir$(pfad)Prüft vor dem Einfügen, ob die Datei existiert, und erzeugt sonst eine verständliche Fehlermeldung.

Wenn der Text am Ende statt am Anfang stehen soll, ersetzen Sie editor.Range(0, 0) durch editor.Range(editor.Content.End - 1, editor.Content.End - 1). Bei Antworten landet der Text dann allerdings unter dem zitierten Original.

5. Installation

  1. Ordner anlegen. Erstellen Sie unter Dokumente den Ordner Mailtexte und legen Sie dort Ihre Textbausteine als Word-Dokumente ab. Ist Ihr Dokumente-Ordner per OneDrive umgeleitet, passen Sie den Pfad in StartOrdner an.
  2. VBA-Editor öffnen. Drücken Sie in Outlook Alt + F11.
  3. Modul einfügen. Wählen Sie Einfügen → Modul. Ein Eintrag in ThisOutlookSession ist hier nicht nötig, weil das Makro auf kein Outlook-Ereignis reagiert.
  4. Code einfügen. Kopieren Sie den vollständigen Code in das neue Modul. Steht dort bereits Option Explicit, lassen Sie die doppelte Zeile weg.
  5. Prüfen und speichern. Wählen Sie Debuggen → Kompilieren von VbaProject und speichern Sie mit Strg + S.
  6. Makrosicherheit. Unter Datei → Optionen → Trust Center → Einstellungen für das Trust Center → Makroeinstellungen wählen Sie „Benachrichtigungen für digital signierte Makros, alle anderen Makros deaktiviert“ und signieren das Projekt, oder für einen ersten Test „Benachrichtigungen für alle Makros“.

6. Ausführung

Über die Makroliste: Markieren Sie eine E-Mail, drücken Sie Alt + F8 und starten Sie WordTextAlsAntwort oder WordTextAlsNeueMail.

Als Schaltfläche: Unter Datei → Optionen → Menüband anpassen legen Sie auf der Registerkarte Start eine neue Gruppe an, wählen links die Kategorie Makros und fügen beide Makros hinzu. Über Umbenennen vergeben Sie sprechende Namen wie „Antwort aus Word“ und „Neue Mail aus Word“ sowie ein passendes Symbol. Alternativ fügen Sie die Makros der Symbolleiste für den Schnellzugriff hinzu; dann erreichen Sie sie auch mit Alt und der angezeigten Zifferntaste.

Möchten Sie die Antwort-Variante auch direkt im geöffneten Nachrichtenfenster nutzen, fügen Sie die Schaltfläche zusätzlich im Menüband des Lesefensters hinzu (im geöffneten Nachrichtenfenster Datei → Optionen → Menüband anpassen).

7. Fehlerbehebung

ProblemUrsacheLösung
„Bitte zuerst eine E-Mail markieren oder öffnen.“Markiert ist ein Termin, eine Besprechungsanfrage oder nichts.Eine normale E-Mail markieren und das Makro erneut starten.
Der Dateidialog erscheint nichtEr öffnet sich hinter dem Nachrichtenfenster.In der Taskleiste das Word-Symbol anklicken oder mit Alt + Tab wechseln.
Statt des Dialogs erscheint ein EingabefeldDer Word-Dateidialog war nicht verfügbar.Den vollständigen Pfad eintragen, z. B. per Rechtsklick auf die Datei → Als Pfad kopieren; Anführungszeichen werden automatisch entfernt.
„Die Datei wurde nicht gefunden“Tippfehler im Pfad oder Datei verschoben.Pfad prüfen bzw. Datei über den Dialog auswählen.
Formatierung geht verlorenDie Nachricht ist im Nur-Text-Format.Prüfen, ob die Zeile BodyFormat = olFormatHTML vorhanden ist; Nur-Text-Antworten unterstützen keine Formatierung.
Bilder aus dem Dokument fehlen beim EmpfängerVerknüpfte statt eingebettete Bilder im Word-Dokument.Im Word-Dokument Bilder über Einfügen → Bilder einbetten, nicht verknüpfen.
Makros sind deaktiviertMakrosicherheit oder Unternehmensrichtlinie.Einstellungen gemäß Abschnitt 5 prüfen; auf verwalteten Geräten die IT fragen.
Alt + F11 öffnet keinen EditorSie nutzen das neue Outlook.Zum klassischen Outlook wechseln; das neue Outlook unterstützt kein VBA.

8. Erweiterungen

  • Allen antworten oder weiterleiten: Reply durch ReplyAll oder Forward ersetzen.
  • Feste Textbausteine: Für einen häufig genutzten Text den Dialog überspringen und den Pfad direkt übergeben, etwa WordDateiEinfuegen antwort, StartOrdner() & "Lieferzeit.docx", als eigenes Makro mit eigener Schaltfläche.
  • Platzhalter ersetzen: Nach dem Einfügen mit editor.Content.Find.Execute Platzhalter wie [Name] durch original.SenderName ersetzen.
  • Anrede ergänzen: Vor dem Einfügen eine Zeile wie „Guten Tag Herr …“ mit editor.Range(0, 0).InsertBefore setzen.
  • Kategorie setzen: Das Original nach dem Antworten mit original.Categories = "Beantwortet" kennzeichnen.

9. Sicherheitshinweise

Das Makro liest nur die Datei, die Sie selbst auswählen, und versendet nichts eigenständig. Fügen Sie nur Dokumente aus vertrauenswürdigen Quellen ein: Felder, Verknüpfungen oder versteckter Text aus fremden Dokumenten landen sonst ungeprüft in Ihrer E-Mail. Dokumente mit Makros (.docm) werden eingefügt, ihre Makros aber nicht ausgeführt.

Aktivieren Sie nicht pauschal alle Makros, sondern signieren Sie Ihr VBA-Projekt im VBA-Editor über Extras → Digitale Signatur. Für den Einsatz im Unternehmen eignet sich ein von der IT bereitgestelltes Codesignaturzertifikat; für den privaten Rechner genügt ein mit SelfCert.exe erstelltes Zertifikat.

Schreibe einen Kommentar

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