TL;DR — Für Word ist ein Dokument ein einziger langer Strom von Zeichen, und ein Word-
Rangeist 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 Rangemeint in Excel Excels Range, also scheitertSet r = doc.Contentmit einem Typenfehler; ein unqualifiziertesActiveDocumentoderSelectionerzeugt 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
ActiveDocumentFehler 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
