VB 5/6-Tipp 0598: Word-Vorlage aus VB heraus füllen
von Klaas Hoffmann
Beschreibung
Dieser Tipp zeigt, wie man eine Word-Vorlage automatisch ausfüllen und drucken kann, ohne, dass man selbst viel Hand anlegen muss.
Update am 07. April 2005 von Florian Rittmeier nach einem Vorschlag von R. Müller:
Das Programm wird nun korrekt beendet. Außerdem wird darauf gewartet, dass der Drucker fertig ist, bevor die Anwendung terminiert wird.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: keine | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Projekt1.vbp ------------- ' Es muss ein Verweis auf 'Microsoft Word 9.0 Object Library' gesetzt werden. '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Schaltfläche "cmdDrucken" ' Steuerelement: Beschriftungsfeld "Label10" ' Steuerelement: Beschriftungsfeld "Label9" ' Steuerelement: Beschriftungsfeld "Label8" ' Steuerelement: Beschriftungsfeld "Label7" ' Steuerelement: Beschriftungsfeld "Label6" ' Steuerelement: Beschriftungsfeld "lblOrt" ' Steuerelement: Beschriftungsfeld "lblPlz" ' Steuerelement: Beschriftungsfeld "lblNachname" ' Steuerelement: Beschriftungsfeld "lblVorname" ' Steuerelement: Beschriftungsfeld "lblKundenNummer" Option Explicit '************************************************************************* '* Text aus Labelfeldern an Worddokument übergeben und dieses ausdrucken * '* * '* Textmarken einfügen über Einfügen ... Textmarke * '* (wo der Cursor steht wird die Textmarke gesetzt * '* Erstellt von: Klaas Hoffmann (hoffmann.guenther@t-online.de) 04.2003 * '* * '* Einzubinden über Projekt->Verweise: * '* Microsoft Word Object xx.x Library (xx.x für jeweilige Version) * '************************************************************************* 'Name des Dokumentes Private Const WordDocVorlage As String = "VorlageKundeninformation.dot" Private Sub Form_Load() With Me .lblKundenNummer.Caption = "0001" .lblVorname.Caption = "Max" .lblNachname.Caption = "Mustermann" .lblPlz.Caption = "28211" .lblOrt.Caption = "Bremen" End With End Sub Private Sub CmdBeenden_Click() End Sub Private Sub CmdDrucken_Click() ' Dokument mit Labeltexten füllen und über Word(Vorlage) drucken ' (Word ist dabei unsichtbar) Dim WordAppl As Word.Application ' Word-Application Dim WdDoc As Word.Document ' Word-Dokument Dim WordApplLiefNicht As Boolean ' Falls Word nicht läuft ' Versuchen eine laufende Instanz von Wort zu verwenden On Error Resume Next Set WordAppl = GetObject(, "Word.Application") ' Wenn Word nicht ausgeführt wird, Word starten: On Error Goto errorMsgWord If WordAppl Is Nothing Then WordApplLiefNicht = True Set WordAppl = CreateObject("Word.Application") End If ' Dokument öffnen On Error Goto errorMsgVorlage Set WdDoc = WordAppl.Documents.Add( _ Template:=App.Path & "\" & WordDocVorlage, _ NewTemplate:=False _ ) On Error Goto 0 ' Word unsichtbar machen WordAppl.Application.Visible = False ' Texte den Textmarken in der Word-Vorlage zuweisen: If WordAppl.ActiveDocument.Bookmarks.Exists("Tm_Kundennummer") Then WordAppl.ActiveDocument.Bookmarks("Tm_Kundennummer").Range.Text = _ Me.lblKundenNummer.Caption End If If WordAppl.ActiveDocument.Bookmarks.Exists("Tm_Nachname") Then WordAppl.ActiveDocument.Bookmarks("Tm_Nachname").Range.Text = _ Me.lblNachname.Caption End If If WordAppl.ActiveDocument.Bookmarks.Exists("Tm_Vorname") Then WordAppl.ActiveDocument.Bookmarks("Tm_Vorname").Range.Text = _ Me.lblVorname.Caption End If If WordAppl.ActiveDocument.Bookmarks.Exists("Tm_Plz") Then WordAppl.ActiveDocument.Bookmarks("Tm_Plz").Range.Text = _ Me.lblPlz.Caption End If If WordAppl.ActiveDocument.Bookmarks.Exists("Tm_Ort") Then WordAppl.ActiveDocument.Bookmarks("Tm_Ort").Range.Text = _ Me.lblOrt.Caption End If ' Dokument drucken und warten bis Druck seitens Word abgeschlossen Call WdDoc.PrintOut(Background:=False) ' Dokument schließen / nicht speichern WdDoc.Close wdDoNotSaveChanges ' Dokument zerstören Set WdDoc = Nothing ClearExit: ' Word beenden, falls wir es erst gestartet haben If WordApplLiefNicht Then WordAppl.Application.Quit End If Set WordAppl = Nothing Exit Sub errorMsgWord: MsgBox "Es konnte keine Verbindung zu Word hergestellt werden!", 16, "Fehler" Exit Sub errorMsgVorlage: MsgBox "Die Dokumentvorlage '" & WordDocVorlage & "' konnte nicht geöffnet werden !", _ 16, "Fehler" Goto ClearExit End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '-------------- Ende Projektdatei Projekt1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 25 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von André Hunger am 26.06.2011 um 18:05
Hallo,
der Code funzt bei mir einwandfrei - is auf folgendes Problem:
Wenn ich eimnmal Word gestartet und die Felder ausgefüllt
habe tut er das beim nächsten Aufruf nicht mehr, d.h. Word
wird zwar gestartet, aber die Felder werden nicht automatisch
ausgefüllt, das Script "steht" auf der Stelle.
An was kann das liegen?
LG André
Kommentar von Bernd am 01.11.2009 um 14:25
Hallo zusammen.
Ich habe versucht das Projekt in mein Programm einzubinden, bekommen aber immer bei
' Dokument drucken und warten bis Druck seitens Word abgeschlossen
Call WdDoc.PrintOut(Background:=False)
eine Fehlermeldung "Laufzeitfehler 91; Objektvariable oder Withvariable nicht definiert. Ich habe leider keine Ahnung voran das liegt, kann mir einer helfen????
Gruß Bernd
Kommentar von Marion Angermann am 12.05.2009 um 22:16
Hallo, Du solltest bei jedem Brief ein Document, das auf der Grundlage einer Vorlage besteht öffnen.
Private oApp As Word.Application
Private oDoc As Word.Document
dim strDateiName as String
'Dateiname ist Pfad zur Vorlage und Dateiname
Set oDoc = oApp.Documents.Add(Template:=strDateiName)
Grüße
Marion
Kommentar von Fischer am 11.05.2009 um 20:39
Hallo, ich habe ein Wordvorlage erstellt,worin ich die Textmarken aus meiner *.mdb fühlen möchte.
Das gelingt mir sehr gut, aber wenn ich die Vorlage zum Beispie für einen anderen Kunden bei drucken in Word verwenden möchte, haben die Textmarken bereits die Werte von zuvor drin.Also es passiert folgendes: Die neue Werte werden einfach zum alten Werten dazugeschrieben.
Wie kann ich dieses Umgehen.
MFG
Andreas fischer
Kommentar von Georg am 03.09.2008 um 12:59
Beim öffnen eines Dokumentes bleibt Word mit einer Fehlermeldung stehen wegen einer fehlenden Schriftart.
Kann man beim open-Befehl eine Parameter so angeben, dass eine Fehlermeldung ignoriert wird und das Dokument trotzdem (fehlerhaft) geöffnet wird?
Meine automatisch laufende Anwendung bleibt sonst bis zum SanktNimmerleins Tag stehen :-(
Kommentar von Rolf Wahlbrinck am 24.01.2008 um 21:23
Der Tipp ist sehr nützlich, aber:
Auch wenn Word schon lief, wird es gnadenlos auf visible = false gesetzt, das bleibt dann auch so, auch dann, wenn wir Word nicht selbst gestartet haben und daher quit entfällt!
Ansonsten:
10 x WordAppl.ActiveDocument.Bookmarks. ...
besser und viel (!) schneller ist natürlich
with WordAppl.ActiveDocument.Bookmarks ... End with
Kommentar von Paik am 06.06.2006 um 10:46
Ich habe in VB6 eine kleine Anwendung geschrieben, die ein DataGrid enthält, welches mit Daten aus einer Datenbank gefüllt wird. Jetzt möchte ich gerne wissen, wie, wenn es denn auch möglich ist, ich die Inhalte des DataGrids in eine Tabelle einer WordVorlage importieren kann.
Hinweis: Die Anzahl der Datensätze sind flexibel und ergeben hierdurch unterschiedliche Tabellenzeilen. Diese Tabellenzeilen sollten schon automatisch erweitert werden oder abgeschnitten werden.
Dank schon mal!
Kommentar von Henry am 18.03.2006 um 14:31
Hallo Forum,
gibt es diese Möglichkeit auch mit OpenOffice???
Grüße
Henry
Kommentar von Massi am 16.02.2006 um 14:10
...kann da jemand hefen:
bei der Deklaration:
Dim WordAppl As Word.Application ' Word-Application
Dim WdDoc As Word.Document ' Word-Dokument
bekomme ich bei der Ausführung die Meldung:
Compile error:
user-defined type not defined
...was muss ich machen, damit das läuft...?
...
Kommentar von Martin Höweler am 10.11.2005 um 22:41
Hallo, ich bins nochmal. Habs selbst herausgefunden:
WordAppl.ActiveDocument.Bookmarks("Textmarkenname").Range.Paste
so einfach ist das! Bis dann...
Kommentar von Martin Höweler am 10.11.2005 um 07:45
Hallo zusammen,
weiß jemand, wie man den Inhalt der Zwischenablage auf diese Art und Weise in das Dokument einfügen kann?
Ich brauche das für einen Barcode, den ich mit einem anderen Programm erzeugt habe und der als Grafik in der Zwischenablage liegt. Dieser Barcode soll dann an einer bestimmten Stelle im Dokument erscheinen, so wie es hier mit normalem Text umgesetzt wurde.
mfg
Kommentar von simone am 17.05.2005 um 23:00
hallo, brauche dringend hilfe
habe den Verweis auf die Object Libary 9.0 gesetzt und die Textmarken in Word gesetzt, alles wie beschrieben. Das ausgewählte Dokument wird beim Ausführen des Programms geöffnet, dann kommt eine Fehlermeldung "Laufzeitfehler '424'-Objekt erforderlich", beim Debuggen habe ich festgestellt das es an dem Befehl liegt in dem die Daten der Textmarke zugewiesen werden. Woran könnte das liegen???
danke im voraus
Kommentar von Marion Angermann am 04.01.2005 um 00:18
'Unterprogramm Ausgaben an die Textmarken, Deklinationen die 'ans Hauptprogramm weitergegeben werden
Private Sub Text_Ausgeben(ByVal strTextmarkenName As String, ByVal strAusgabeText As String)
If ActiveDocument.Bookmarks.Exists(strTextmarkenName) Then
With Selection
.GoTo what:=wdGoToBookmark, Name:=strTextmarkenName
.TypeText strAusgabeText
End With
Else
MsgBox strTextmarkenName & " nicht vorhanden"
End If
End Sub
'Habe die Ausgaben an die Textmarken in ein Unterprogramm 'gepackt und rufe sie aus dem Hauptprogramm auf:
Call Text_Ausgeben("MarkeName1", strName1)
Call Text_Ausgeben("MarkeName2", strName2)
'geht wunderbar bis wenn mein Programm bei "wdDoc.printout" 'oder bei "wdDoc.saveas" ankommt, bekomme ich eine 'Fehlermeldung:
'Automatisierungsfehler
'Ausnahmefehler des Servers
'wie kann ich das beheben?
Kommentar von Klaas am 24.04.2004 um 12:17
Hi MOS,
laut Deinem Code-Ausschnitt wird das Word-Objekt 2x instanziiert:
Set wApp = CreateObject("Word.Application.8")
If Lnr2 = "17101" Then
'...
Ansonsten kannst mir mal den Source schicken, ich kanns mir dann ja mal anschauen...
Gruß
Klaas
Kommentar von MOS am 24.04.2004 um 10:49
Sers,
ich habe auf meinen Rechner keine Probleme mit den Prog,
Win XP VB 6.0 Office XP
Allerding muss das Programm nach der erstellung auf einen Schulrechner
Win95 VB 6.0 Office 97
laufen, dort werden allerdings nicht die Word fenster geöffnet.
Ich habe das Programm bis jetzt immer auf meinen Rechner komplitiert, kann das prob behoben werden wenn ich es auf einen Schulrechner komplimentiere.
zur überprüfung habe ich mal nen Codeauschnitt kopiert:
Private Sub schreiben_Click()
Set wApp = CreateObject("Word.Application.8")
If Lnr2 = "17101" Then
' Word-Objekt erzeugen
Set wApp = CreateObject("Word.Application.8")
With wApp
' Word anzeigen
wApp.Application.Visible = True
' Word-Dokument laden und anzeigen
.Documents.Open "C:\Schule\anfragen\17101 - Elba.doc"
wApp.ActiveDocument.Bookmarks("Datum").Range.Text = txtdatum.Text
wApp.ActiveDocument.Bookmarks("Name").Range.Text = txtname.Text
wApp.ActiveDocument.Bookmarks("Name2").Range.Text = txtname.Text
wApp.ActiveDocument.Bookmarks("Telefon").Range.Text = txttel.Text
wApp.ActiveDocument.Bookmarks("LEER").Range.Text = " "
If optherr.Value = True Then
wApp.ActiveDocument.Bookmarks("ANREDE").Range.Text = "Herr"
End If
If optfrau.Value = True Then
wApp.ActiveDocument.Bookmarks("ANREDE").Range.Text = "Frau"
End If
wApp.ActiveDocument.Bookmarks("ANZAHL").Range.Text = txtanzahl.Text
wApp.ActiveDocument.Bookmarks("NK").Range.Text = txtnk.Text
wApp.ActiveDocument.Bookmarks("BESCHREIBUNG").Range.Text = txtBeschreibung.Text
wApp.ActiveDocument.Bookmarks("ABTEIL").Range.Text = txtabteilung.Text
wApp.ActiveDocument.Bookmarks("VGNR").Range.Text = txtvgnr.Text
wApp.ActiveDocument.Bookmarks("NR").Range.Text = txtnr.Text
End With
Und dann hab ich ne Frage; Kann mann es irgendwie einrichten das aus "txtvgnr.text" und "txtdatum.text" ein Speicher Dateiname erstellt wird - matrix: vgnr - datum (22 - 24-04-2004.doc)
Kommentar von volkuhl am 07.01.2004 um 17:33
Kleine Ergänzung für das Ausfüllen von Formularfeldern:
'Textfeld:
If WordAppl.ActiveDocument.Bookmarks.Exists("Text1") Then
WordAppl.ActiveDocument.FormFields("Text1").Result = "Text1"
End If
'Checkbox:
If WordAppl.ActiveDocument.Bookmarks.Exists("Kontrollkästchen1") Then
WordAppl.ActiveDocument.FormFields("Kontrollkästchen1").CheckBox.Value = 1
End If
Kommentar von Cyberclone am 16.12.2003 um 19:25
Ich habe den Code für .NET abgeändert, siehe unten, die abgeänderten Stellen, sowie eine Funktion um den App.Path zu ermitteln:
' Dokument öffnen:
WdDoc = WordAppl.Documents.Add(Template:=App_Path() & "\" & WordDocVorlage, _
NewTemplate:=False)
' Word unsichtbar machen
WordAppl.Application.Visible = False
' Texte den Textmarken in der Word-Vorlage zuweisen:
If WordAppl.ActiveDocument.Bookmarks.Exists("Test1") Then
WordAppl.ActiveDocument.Bookmarks.Item ("Test1").Range.Text = _
TextBox1.Text
End If
Private Function App_Path() As String
Return System.AppDomain.CurrentDomain.BaseDirectory()
End Function
Kommentar von Klaas am 13.11.2003 um 15:59
@-------------------- ALL -------------------------------
Solche Fragen bitte im Forum stellen, da Ihr dort
natürlich eine höhere Wahrscheinlichkeit habt, dass Euch
jemand helfen kann, da auch mehr Leute da sind.
@-------------------- ALL -------------------------------
@Hansi
Guten Tag Hansi,
ich habe es noch nicht mit Bildern ausprobiert,
daher kann ich Dir hier keine Hilfestellung geben.
Gruß
Klaas
Kommentar von Hansi am 13.11.2003 um 11:33
Hallo,
wie funktioniert das Ganze mit Bildern (.jpg) anstelle mit Textfeldern ?
Kommentar von sizi am 30.10.2003 um 11:52
Hallo,
ich arbeite an einem Programm, dass aus einer Access-Datenbank Texte ausliest und in eine Dokumentvorlage schreibt. Die Anzahl der Texte, die in das Dokument geschrieben werden sollen, ist erst zur Laufzeit bekannt. Deshalb soll der Text in die Zeile vor dem TextFormularFeld eingefügt werden, damit dies weiterhin erhalten bleibt und anschließend wieder angesprochen werden kann, um den nächsten Text einzufügen.
Ich habe vorerst versucht, ob das Anspringen des TextFormularFeldes, wie im vorgestellten Tipp 0598, bei mir funktioniert.
Leider bekomme ich in der Zeile
wordAppl.ActiveDocument.Bookmarks("TextBlock").Range.Text = "Wieder einmal ein Versuch"
eine Fehlermeldung: Laufzeitfehler 6028: Der Bereich kann nicht gelöscht werden
Was bedeutet diese Fehlermeldung? Was ist an meinem Code falsch?
Zur Übersicht habe ich nochmals den gesamten Code aufgeführt.
Option Explicit
Dim wordAppl As Word.Application
Dim WdDoc As Word.Document
Dim WordApplLiefNicht As Boolean
Const WordDocVorlage As String = "D_Anschreiben.dot"
Private Sub btnfertig_Click()
'wenn Word nicht ausgeführt wird, Word starten:
On Error Goto errorMsgWord
If wordAppl Is Nothing Then
WordApplLiefNicht = True
Set wordAppl = CreateObject("Word.Application")
End If
On Error Resume Next
Set wordAppl = GetObject(, "Word.Application")
'Dokument öffnen
On Error Goto errorMsgVorlage
Set WdDoc = wordAppl.Documents.Add(Template:=App.Path & "\" & WordDocVorlage, Newtemplate:=False)
On Error Goto 0
wordAppl.Application.Visible = True
If wordAppl.ActiveDocument.Bookmarks.Exists("TextBlock") Then
wordAppl.ActiveDocument.Bookmarks("TextBlock").Range.Text = "Wieder einmal ein Versuch"
End If
Set WdDoc = Nothing
If WordApplLiefNicht Then
wordAppl.Application.Quit
Set wordAppl = Nothing
End If
Set wordAppl = Nothing
Exit Sub
errorMsgWord:
MsgBox "keine Verbindung zu Word", 16, "Fehler"
Exit Sub
errorMsgVorlage:
MsgBox "Vorlage " & WordDocVorlage & " konnte nicht geöffnet werden!", 16, "Fehler"
Exit Sub
End Sub
Kommentar von Armand, Rakotoarisoa am 27.08.2003 um 11:54
Hallo!
ich habe ein klein Programm gemacht und so funktioniert das:
der angeklikte Datensatz (double click) im DataGrid muß in einer andere Formular mit mehrere Label und Textfelder erscheint werden und diese soll man ausgedruckt werden.
Mein Frage ist: können Sie bitte, so schnell wie möglich, die Quelltext für den Button "cmd_Print" dieser Formular mir schicken?
vielen Danke!
Kommentar von Klaas am 28.07.2003 um 18:26
Indem Du auf das Menü gehst ("Einfügen") und dort "Textmarke" auswählst.
Kommentar von Gerald am 28.07.2003 um 10:25
Wie kann ich im Word Bookmarks erstellen?
Kommentar von Klaas am 04.07.2003 um 08:33
Der Verweis auf Word hat mit Ihrer Office-Version zu tun.
Die Datei für den Verweis liegt normalerweise im Officeordner und somit hat die VB-Version damit eigentlich nichts zu tun.
Ich hatte vor OfficeXP auch nur die Library 9.0, funktionierte damit bei mir aber auch.
Ich krame mal ein bißchen rum.
Schöne Grüße
Klaas
Kommentar von Sven Huckenbeck am 26.06.2003 um 11:06
Ich habe VB6 in der Professional Version. Doch kann ich
nur einen Verweis auf Microsoft Word 9.0 Object Library erstellen !? Daraufhin funktioniert das Beenden ohne zu speichern von Word nicht. Also habe ich die Programmzeile
deaktiviert. Dann habe ich aber ständig wechselnde Fehlermeldungen, die sowoahl Word als auch die Druckeransteuerung betrifft. Wenn ich mich da durchgeklickt habe, wird letztendlich das Dokument ausgedruckt. Nur der Weg dorthin ist natürlich nicht befriedigend. Vielleicht
liegt es ja an der fehlenden Object Library. Wo bekomme ich
die her?
Grüße ...
Sven Huckenbeck