🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Word in Excel — Vorlage befüllen, den Range-Konflikt und Fehler 462 vermeiden

|

VBA Word in Excel — Vorlage befüllen, den Range-Konflikt und Fehler 462 vermeiden

TL;DR — Für Word ist ein Dokument ein einziger langer Strom von Zeichen, und ein Word-Range ist nur eine Start- und eine Endposition darin. Sie besuchen keine Zellen; Sie beschreiben einen Textabschnitt und arbeiten mit ihm. Das bewährte Muster aus Excel: Das Layout liegt in einer Word-Vorlage mit Platzhaltern wie {{Client}}; Sie öffnen eine Kopie, ersetzen die Platzhalter durch Werte aus dem Tabellenblatt, speichern, schließen, beenden. Drei Dinge brechen dieses Muster: Dim r As Range meint in Excel Excels Range, also scheitert Set r = doc.Content mit einem Typenfehler; ein unqualifiziertes ActiveDocument oder Selection erzeugt eine versteckte Verbindung zu Word, die beim zweiten Lauf mit Fehler 462 abbricht; und Suchen und Ersetzen verweigert Ersatztext mit mehr als 255 Zeichen. Qualifizieren Sie jedes Word-Objekt über Ihre eigenen Variablen, und alle drei Probleme verschwinden.

Sub QuickLetter()
    Dim wd As Object, doc As Object
    Set wd = CreateObject("Word.Application")              ' ein neues, unsichtbares Word
    Set doc = wd.Documents.Add(ThisWorkbook.Path & "\Letter.dotx")
    doc.Content.Find.Execute FindText:="{{Client}}", _
        ReplaceWith:=Range("B2").Value, Replace:=2         ' 2 = wdReplaceAll
    doc.SaveAs2 ThisWorkbook.Path & "\Letter_out.docx"
    doc.Close
    wd.Quit
End Sub

Dies ist der zweite Artikel einer dreiteiligen Reihe darüber, andere Office-Programme aus Excel zu steuern. Die PowerPoint-Anleitung behandelt eine Präsentation aus Formen auf Folien. Hier geht es um Word: einen Textstrom. Die Anleitung zu Verweisen erklärt, wie VBA das Vokabular des anderen Programms lernt — und genau daher stammt der Range-Konflikt weiter unten. Die Regel für alle drei: Jedes Objekt gehört zu genau einer Anwendung — sagen Sie also, zu welcher.

Was Sie lernen

  • Das mentale Modell: Ein Dokument ist ein Textfluss, ein Range ist ein Paar von Positionen
  • Wie Sie Word starten, eine Vorlage öffnen und am Ende alles sauber schließen
  • Wie Sie Platzhalter ersetzen, auch durch Text mit mehr als 255 Zeichen
  • Den Range-Konflikt zwischen Excel und Word, und wie Sie ihn vermeiden
  • Warum ein unqualifiziertes ActiveDocument Fehler 462 und ein übrig gebliebenes WINWORD.EXE verursacht
  • Wie Sie eine Excel-Tabelle einfügen, als DOCX speichern und als PDF exportieren

Das mentale Modell: ein Textfluss, kein Raster

Excel spricht einen Wert über Zeile und Spalte an. Word kennt keine Zeilen und Spalten, außer in Tabellen. Ein Word-Dokument ist eine Folge von Zeichen, Absatzmarken eingeschlossen, und fast alles ist ein Range: eine Start- und eine Endposition in dieser Folge.

Sie wollen Ausdruck in Word
den gesamten Textkörper doc.Content
einen Absatz doc.Paragraphs(3).Range
eine markierte Stelle in der Vorlage doc.Bookmarks("Total").Range
das Ende des Dokuments doc.Content, auf sein Ende reduziert

Sie arbeiten mit einem Range, indem Sie seinen .Text setzen, seine .Font formatieren oder ihn mit .Find durchsuchen. Ändern Sie den Text, verschieben sich alle Positionen dahinter — deshalb bricht Code, der sich Zeichennummern merkt, während Code, der nach Markierungen sucht, weiterläuft.

Die Arbeitsteilung ist also dieselbe wie bei PowerPoint: Excel hält die Daten, Word hält das Layout. Gestalten Sie Brief, Vertrag oder Bericht in Word, als Vorlage, die die Fachabteilung selbst bearbeiten kann, und lassen Sie das Makro die Werte einsetzen.

Word starten und sauber beenden

Anders als PowerPoint startet Word bei CreateObject eine neue, unsichtbare Instanz, wie die CreateObject-Anleitung beschreibt. Diese Instanz gehört Ihnen, sie zu beenden ist also unbedenklich. Die Gefahr liegt auf der anderen Seite: Bricht das Makro vor wd.Quit mit einem Fehler ab, läuft das unsichtbare Word weiter, und beim nächsten Öffnen der Vorlage meldet Word, sie sei gesperrt. Setzen Sie das Aufräumen dorthin, wo auch ein Fehler noch ankommt:

Sub MakeLetter()
    Const wdExportFormatPDF As Long = 17
    Dim wd As Object, doc As Object
    On Error GoTo CleanUp

    Set wd = CreateObject("Word.Application")
    Set doc = wd.Documents.Add(Template:=ThisWorkbook.Path & "\Letter.dotx")

    ReplaceTag doc, "{{Client}}", Range("B2").Value
    ReplaceTag doc, "{{Amount}}", Format(Range("B3").Value, "#,##0.00")
    ReplaceTag doc, "{{Terms}}", Range("B4").Value      ' kann ein langer Absatz sein

    doc.SaveAs2 ThisWorkbook.Path & "\Letter_" & Range("B2").Value & ".docx"
    doc.ExportAsFixedFormat OutputFileName:=ThisWorkbook.Path & "\Letter.pdf", _
                            ExportFormat:=wdExportFormatPDF

CleanUp:
    If Not doc Is Nothing Then doc.Close SaveChanges:=False
    If Not wd Is Nothing Then wd.Quit
    Set doc = Nothing
    Set wd = Nothing
    If Err.Number <> 0 Then MsgBox "Letter failed: " & Err.Description
End Sub

Documents.Add mit einem Vorlagenpfad erzeugt ein neues, unbenanntes Dokument auf Basis der .dotx; die Vorlage selbst wird also nie verändert. Die On-Error-Anleitung erklärt den Sprung zu CleanUp. Wenn Sie Word während der Entwicklung zusehen möchten, ergänzen Sie nach dem Erstellen wd.Visible = True.

Platzhalter ersetzen — und die Mauer bei 255 Zeichen

Find.Execute mit Replace:=2 (wdReplaceAll) ist der schnelle Weg, einen Platzhalter auszutauschen, und für Namen, Datumsangaben und Beträge reicht das völlig. Geben Sie ihm aber einen Absatz Vertragsbedingungen, bricht es mit Fehler 5854 ab, String parameter too long (Zeichenfolgenparameter zu lang): Der Ersatztext ist auf 255 Zeichen begrenzt.

Die robuste Variante sucht jeden Platzhalter und schreibt den Text direkt in den gefundenen Bereich — dort gibt es keine Längengrenze:

Sub ReplaceTag(doc As Object, ByVal tag As String, ByVal newText As String)
    Const wdFindStop As Long = 0
    Const wdCollapseEnd As Long = 0
    Dim r As Object                         ' ein Word-Range, NICHT Excels Range
    Set r = doc.Content
    With r.Find
        .ClearFormatting
        .Text = tag
        .MatchCase = True
        .Wrap = wdFindStop
        Do While .Execute
            r.Text = newText                ' r ist jetzt der gefundene Platzhalter
            r.Collapse wdCollapseEnd        ' hinter dem Geschriebenen weitermachen
        Loop
    End With
End Sub

Wenn Execute erfolgreich ist, springt der Range r auf den gefundenen Text; r.Text zu setzen ersetzt also genau den Platzhalter. Das Reduzieren auf das Ende lässt die Schleife dort weitersuchen, sodass ein Wert, der zufällig selbst den Platzhalter enthält, nicht noch einmal ersetzt wird. Platzhalter in geschweiften Klammern sind für den Autor der Vorlage gut sichtbar und lassen sich nicht mit echtem Text verwechseln. Inhaltssteuerelemente und Textmarken von Word funktionieren ebenfalls, aber einfache Platzhalter können auch Nicht-Entwickler pflegen.

Der Range-Konflikt: Excels Range ist nicht Words Range

Beide Programme haben ein Objekt namens Range, dazu Shape, Font, Border und Selection. In Excels VBA meint ein unqualifiziertes Range immer das von Excel, weil Excels Bibliothek in der Prioritätenliste über der von Word steht. Deshalb scheitert Folgendes, selbst mit gesetztem Verweis auf Word:

Dim r As Range                  ' Excel.Range
Set r = doc.Content             ' Laufzeitfehler 13: Type mismatch

Excel meldet hier Type mismatch (in deutschem Office: „Typen unverträglich“). Die Lösung: Sagen Sie, welche Anwendung Sie meinen — Dim r As Word.Range mit Verweis oder Dim r As Object ohne, wie oben in ReplaceTag. Die Anleitung zu Verweisen zeigt die Prioritätenliste, die entscheidet, was ein unqualifizierter Name bedeutet. Die Gewohnheit ist einfach: In Excel-Code ist jede Variable, die ein Word-Objekt hält, entweder Word.Irgendwas oder Object, nie ein nackter Name.

Fehler 462: die versteckte Verbindung durch ein unqualifiziertes ActiveDocument

Der zweite Konflikt ist leiser. Mit gesetztem Verweis auf die Word-Bibliothek lässt Excel Sie die globalen Namen von Word ganz ohne Präfix schreiben:

Set wd = New Word.Application
wd.Documents.Add
ActiveDocument.Content.Text = "Hello"        ' unqualifiziert - klappt beim ersten Mal
wd.Quit

Der erste Lauf funktioniert. Der zweite bricht mit Laufzeitfehler 462 ab, The remote server machine does not exist or is unavailable (der Remoteservercomputer existiert nicht oder ist nicht verfügbar), oder der Task-Manager zeigt ein WINWORD.EXE, das nicht mehr verschwindet. Das unqualifizierte ActiveDocument lief nicht über Ihre Variable wd; VBA hat dafür eine eigene, versteckte Verbindung zu Word aufgebaut. wd.Quit hat Word beendet, aber die versteckte Verbindung zeigt weiter auf die geschlossene Instanz und wird erst gelöscht, wenn das VBA-Projekt zurückgesetzt wird.

Die Regel: Erreichen Sie jedes Word-Objekt über eine Variable, die Sie selbst angelegt haben. Schreiben Sie wd.ActiveDocument — oder besser: Halten Sie das Dokument in doc und verwenden Sie ActiveDocument und Selection überhaupt nicht. Late Binding hilft dabei: Ohne gesetzten Verweis ist ein unqualifiziertes ActiveDocument einfach eine nicht deklarierte Variable, und Option Explicit stoppt sie schon beim Kompilieren.

Eine Excel-Tabelle in das Dokument einfügen

Eine Tabelle, die Sie in Excel bereits formatiert haben, kann als echte Word-Tabelle an einer Textmarke landen, die der Autor der Vorlage gesetzt hat:

Sub PasteTable(doc As Object)
    Dim target As Object
    ThisWorkbook.Worksheets("Summary").Range("A1:D12").Copy
    Set target = doc.Bookmarks("SalesTable").Range
    target.PasteExcelTable LinkedToExcel:=False, WordFormatting:=False, RTF:=False
    Application.CutCopyMode = False
End Sub

LinkedToExcel:=False erzeugt eine einfache Kopie — richtig für einen Brief oder Bericht, der verschickt wird. Eine verknüpfte Tabelle bricht, sobald das Dokument Ihren PC verlässt. WordFormatting:=False behält die Excel-Optik; setzen Sie es auf True, um stattdessen die Tabellenformatvorlage des Dokuments zu übernehmen. Für einen Bereich, der genau wie das Blatt aussehen und nie bearbeitet werden soll, ist CopyPicture mit dem Einfügen als Grafik die Alternative, wie in der PowerPoint-Anleitung.

Direkt in Word: dasselbe Objektmodell

Falls Sie nach Word-VBA gesucht haben, weil Sie ein Makro in Word selbst schreiben wollen: Alles oben gilt weiterhin, nur ohne die Brücke. Im VBA-Editor von Word meinen ActiveDocument, Range und Selection die Objekte von Word, und es gibt keine wd-Variable, über die Sie qualifizieren müssten. Das Textfluss-Modell, die Find-Schleife und die Grenze von 255 Zeichen sind dieselben. Was sich ändert, ist die Richtung: Aus Word heraus wird Excel zum fremden Programm, und dieselben Regeln gelten nun für Excels Range.

Die Abwägung: Word für das Layout, Excel für die Schleife

Für einen einzelnen Brief kann jedes der beiden Programme die Arbeit erledigen. Bei zweihundert zählt die Designentscheidung. Meine Regel: Schleife und Daten bleiben in Excel, das Layout bleibt in einer Word-Vorlage, und das Makro formatiert nie Text, den es der Vorlage hätte überlassen können. Starten Sie Word einmal, erzeugen Sie pro Zeile ein Dokument aus derselben .dotx, schließen Sie jedes nach dem Speichern und beenden Sie Word am Ende. Das ist ein Serienbrief unter Ihrer Kontrolle, mit Dateinamen, PDF-Ausgabe und Fehlerbehandlung nach Ihren Vorstellungen. Der eingebaute Seriendruck von Word taugt gut, um ein langes zusammengeführtes Dokument zu drucken; sobald Sie eine Datei pro Zeile brauchen, gewinnt das Makro.

Wie ExcelMaster hilft

Fehler in der Word-Automatisierung verstecken sich im Raum zwischen den beiden Programmen: ein Typenfehler in einer Zeile, die richtig aussieht, ein WINWORD.EXE, das sich nie beendet, eine Vertragsklausel, die zu lang zum Ersetzen ist.

Mit ExcelMaster beschreiben Sie das Ergebnis, etwa „ein Brief pro Kunde aus meiner Vorlage, als PDF mit dem Kundennamen gespeichert“. ExcelMaster schreibt das Makro mit durchgehend qualifizierten Word-Objekten, einer Platzhalter-Schleife ohne Längengrenze und einem Aufräumteil, der auch dann läuft, wenn eine Zeile fehlschlägt.

Häufig gestellte Fragen

Wie öffne ich ein Word-Dokument aus Excel-VBA?

Erzeugen Sie Word mit CreateObject("Word.Application") und rufen Sie dann wd.Documents.Open mit dem Dateipfad auf — oder wd.Documents.Add mit einem Vorlagenpfad, um ein neues Dokument auf dieser Basis zu erhalten. Halten Sie das Ergebnis in einer Variablen und arbeiten Sie nur über diese Variable.

Warum bekomme ich Fehler 462, wenn ich Word aus Excel automatisiere?

Ihr Code hat ein Word-Objekt ohne Qualifizierung verwendet, meist ActiveDocument oder Selection, und VBA hat deshalb eine versteckte Verbindung zu Word aufgebaut. Nach Quit zeigt diese Verbindung auf ein geschlossenes Programm. Erreichen Sie jedes Word-Objekt über Ihre eigene Variable wd oder doc.

Warum führt Dim r As Range bei Word zu einem Typenfehler?

In Excels VBA meint Range den Range von Excel. Ein Word-Range ist ein anderer Typ, daher scheitert die Zuweisung von doc.Content. Deklarieren Sie die Variable als Word.Range mit Verweis auf Word oder als Object ohne Verweis.

Wie ersetze ich in Word per VBA Text mit mehr als 255 Zeichen?

Suchen Sie den Platzhalter mit Range.Find.Execute und setzen Sie dann .Text des gefundenen Bereichs auf den langen Wert. Die Grenze von 255 Zeichen gilt nur für das Argument ReplaceWith beim Suchen und Ersetzen, nicht für Range.Text.

Wie speichere ich ein Word-Dokument aus Excel-VBA als PDF?

Rufen Sie doc.ExportAsFixedFormat mit einem Ausgabedateinamen und ExportFormat:=17 auf, also wdExportFormatPDF. Das Dokument bleibt danach geöffnet; schließen Sie es und beenden Sie Word anschließend.

Getestet in

Getestet in: Excel 365 und Word 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 02.10.2026.

Verwandte Anleitungen: VBA PowerPoint · VBA References · VBA CreateObject · VBA Outlook · VBA On Error · VBA Option Explicit · VBA Replace · VBA Save as PDF