Viele repetitive und zeitraubende Aufgaben in Office lassen sich mit VBA automatisieren. Am Beispiel eines Serienbriefs zeigt VBA-Trainer Jörn Schramm, wie Sie Excel-Inhalte mit einem Klick in Word importieren.
Sie verfügen über eine Liste mit Adressen, die in einer Excel-Arbeitsmappe gespeichert ist. Für einen Serienbrief möchten Sie auf diese Daten zurückgreifen, ohne dass Sie die Adressen Zeile für Zeile manuell in Word einfügen müssen.
Das geht. Mit ein wenig Programmier-Kenntnissen in VBA (Visual Basic for Applications) lässt sich jede Adresse mit einem Klick in den Adressteil der Word-Vorlage einspielen. Trainer Jörn Schramm führt Sie Schritt für Schritt durch die Übung.
Die folgende Abbildung zeigt einen Auszug aus einer Liste mit Adressen. (Alle Adressen sind frei erfunden und jede Ähnlichkeit mit echten Adressen wäre rein zufällig.)
Die aktive Zelle ist A10. Es soll ein Brief an die Adresse dieser Zeile geschrieben werden.
Damit per Programm Informationen an exakten Positionen in einem Word-Dokument platziert werden können, müssen diese Positionen gekennzeichnet werden. Hierzu werden Textmarken verwendet.
Hierbei unterscheidet man Positions-Textmarken, welche nur durch die jeweilige Position der Schreibmarke bestimmt werden; diese sind später im Dokument aber nur erkennbar, wenn dies in den Word-Optionen so eingestellt ist.
Für eine spätere Bearbeitung eines Dokuments sind Inhalts-Textmarken besser handhabbar: Sie enthalten bereits einen aussagefähigen Text und werden durch das Programm später überschrieben.
In der bereits vorbereiteten Dokumentvorlage sollen für die Positionen, in denen im Moment «Anschrift», «Datum» und «Betreff» stehen, Textmarken definiert werden.
Hierzu werden die Texte jeweils markiert und über die Registerkarte «Einfügen»/»Textmarke» die entsprechenden Textmarken eingefügt. Damit sind die Arbeiten an der Word-Vorlage erledigt.
Da das Programm von Excel aus gestartet werden soll, müssen wir Excel aber noch beibringen, dass es auch ein Word gibt; für den Zugriff auf das Word-Dokument fehlen im Excel-VBA sonst die Anweisungen.
Hierzu ist es notwendig, einen Verweis auf die Word-Bibliothek zu setzen. Über «Extras>/»Verweise» muss diese eingebunden werden.
Nun beginnt die eigentliche VBA-Programmierung.
Dim lngZeile As Long
Dim strAdresse As String
Dim strBetreff As String
Ein Word-Objekt erstellen
Dim objWord As New Word.Application
objWord.Visible = True
Ein neues Word-Dokument auf Basis der Vorlage erstellen
objWord.Documents.Add "Office Tools AG Brief.dotx"
Sicher stellen, dass das richtige Tabellenblatt aktiv ist
Sheets("Adressliste").Activate
lngZeile = ActiveCell.Row
Adresse zusammenbauen; vbNewLine erzeugt einen Zeilenumbruch
strAdresse = Cells(lngZeile, 1) & vbNewLine & Cells(lngZeile, 3) & " " & Cells(lngZeile, 2) _
& vbNewLine & Cells(lngZeile, 4) & vbNewLine & Cells(lngZeile, 5) & " " & Cells(lngZeile, 6)
strBetreff = InputBox("Betreff eingeben:", "Brief schreiben", "Bitte hier den Betreff...")
objWord.ActiveDocument.Bookmarks("Anschrift").Range.Text = strAdresse
objWord.ActiveDocument.Bookmarks("Datum").Range.Text = Date
objWord.ActiveDocument.Bookmarks("Betreff").Range.Text = strBetreff
Weitere Blog-Beiträge von unseren Trainern zum Thema VBA:
Empfohlenes Kursangebot in VBABootcamp: Microsoft Visual Basic for Applications (VBA) («BCVBA1») Die umfassende Weiterbildung für angehende VBA-Programmierer. Mehr erfahren Tageskurse:
|
Bootcamp: Microsoft Visual Basic for Applications (VBA) («BCVBA1»)
Die umfassende Weiterbildung für angehende VBA-Programmierer. Mehr erfahren
Tageskurse:
4 Kommentare
Hallo Jörn,
danke für den guten Artikel, Ich habe allerdings noch eine weitere Komplikation wegen der Ich frage. Ich will ein Word aus einer Vorlage mit Tabelle generieren, allerdings will ich nicht nur eine Zeile hierfür nehmen sondern mehrere . Die Tabelle soll dann die Daten der ausgewählten Zellen beinhalten, wenn man nur eine Zeile oder auch bis zu 10.
Ist das technisch umsetzbar und wenn ja was wäre hier der Ansatz?
Vielen Dank!
Lieber Paul
Natürlich ist das technisch umsetzbar – wie du fragst. Allerdings sind hier ein paar Handgriffe mehr erforderlich.
Der erste Schritt ist: Wie selektierst du die Datensätze, die in das Word-Dokument übernommen werden sollen.
Natürlich kann man eine Mehrfach-Selektion in Excel durchführen – diese aber per VBA einzulesen, dazu musste ich selbst erst einmal Google bemühen.
Ich würde die benötigten Datensätze
– entweder durch ein Ankreuzfeld (X) kennzeichnen
– oder durch einen Filter vorselektieren (und evtl. auf ein separates Blatt kopieren)
Die gefundene Menge von Datensätzen kannst du dann mittels einer For-Next-Schlaufe durchlesen und übertragen.
Bleibt noch: Durch eine Textmarke musst du die erste Zelle im Word-Dokument kennzeichnen, damit du sie anspringen kannst.
Von dort aus kannst du mit den entsprechenden Word-Befehlen z.B.Selection.MoveRight o.ä. in weitere Zellen wechseln.
Viel Erfolg! Ich hoffe, ich konnte dir helfen.
Bis zum nächsten Mal. Liebe Grüsse, Jörn
Hallo Jörn,
das ist eine tolle Lösung, für meine Aufgabenstellung. Das heißt: Leider nur fast :’-(
Das Bestücken der Word-Textmarken mit den Excelwerten klappt hervorragend, aber leider wird die Textmarke dabei in Word gelöscht. Ich müsste im fortlaufenden Word-Doc aber mehrmals nochmal auf eben diese Textmakren zurückgreifen (REF-Felder). Gibt es eine Möglichkeit, direkt nach dem Einfügen des NEUEN WERTES erneut eine Textmarke um genau diesen eingefügten Wert (evtl. mehrere, von einander getrennte Worte) wieder zu setzen?
Ich suche nun schon viele Tage nach einer Lösung, bisher leider vergeblich. Kannst du mir weiterhelfen?
VG Rob
Hallo Rob,
das lässt sich lösen, indem du Positions-Textmarken verwendest und keine Inhalts-Textmarken. Du definierst die Textmarken an der gewünschten Stelle, ohne zuvor ein Wort zu markieren. In deinem Programm musst du dann etwas anders vorgehen. So:
ActiveDocument.GoTo wdGoToBookmark, , , “Hier”
Selection.TypeText “Irgendwas ”
In meinem Beispiel steht “Hier” für den Namen der Textmarke. Mit der TypeText-Methode gibst du den gewünschten Text in das Dokument aus. Die Textmarke wird dann – wie gewöhnlicher Text – nach rechts verschoben und bleibt erhalten.
Viel Erfolg
Jörn.