{"id":55000714,"date":"2010-04-01T00:00:00","date_gmt":"2020-05-22T22:12:11","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=714"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Ferngesteuerter_Seriendruck_mit_Access_und_Word","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/","title":{"rendered":"Ferngesteuerter Seriendruck mit Access und Word"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg03.met.vgwort.de\/na\/f46ba72fe8604b88be351885fb801c0d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Eines der meistgefragten Themen im Office-Bereich ist immer wieder: Wie schaufle ich am einfachsten die Daten einer Access-Tabelle nach Word und f&uuml;lle damit einen Serienbrief Sie k&ouml;nnen dazu nat&uuml;rlich einfach eine Abfrage mit den relevanten Daten vorbereiten und den Rest von Word aus mit den entsprechenden Werkzeugen der Benutzeroberfl&auml;che erledigen. Wenn Sie dem Nutzer aber wirklich Arbeit ersparen m&ouml;chten, zwingen Sie ihn nicht, seine geliebte Access-Anwendung zu verlassen &#8230;<\/b><\/p>\n<p>In der Regel verl&auml;uft das Erstellen eines Dokuments f&uuml;r den Seriendruck so:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Der Benutzer erstellt eine Abfrage, die alle f&uuml;r den Seriendruck zu verwendenden Daten enth&auml;lt. Dies ist der Teil, den er von Access aus erledigen kann, das Filtern ist auch sp&auml;ter in Word noch m&ouml;glich.<\/li>\n<li class=\"aufz-hlung\">Danach startet er Word, erzeugt ein Seriendruckdokument und w&auml;hlt die Datenherkunft f&uuml;r die Adressaten und weitere Informationen aus &#8211; in diesem Fall aus der bereits vorbereiteten Access-Abfrage.<\/li>\n<li class=\"aufz-hlung\">Dann f&uuml;gt der Benutzer die Seriendruckfelder in das Dokument ein, die auf den in der Datenherkunft definierten Feldern basieren.<\/li>\n<li class=\"aufz-hlung\">Nachdem er gegebenenfalls noch die Empf&auml;ngerliste bearbeitet hat, sorgt ein Klick auf die Schaltfl&auml;che <b>Fertig stellen und zusammenf&uuml;hren <\/b>f&uuml;r das Erstellen des fertigen Seriendruckdokuments.<\/li>\n<\/ul>\n<p>Details wollen wir uns an dieser Stelle ersparen, Anleitungen f&uuml;r den &uuml;blichen Weg gibt es wie Sand am Meer.<\/p>\n<p><b>Optimaler Seriendruck mit Access und Word<\/b><\/p>\n<p>Wir haben uns gefragt, wie man dem Benutzer die Seriendruckerstellung eines Serienbriefs so einfach wie m&ouml;glich machen kann. Tatsache ist, dass er um die folgenden drei Aufgaben nicht herumkommt:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Festlegen der einzuf&uuml;genden Daten, sprich: Welche Datenfelder und welche Datens&auml;tze sollen den Serienbrief f&uuml;llen<\/li>\n<li class=\"aufz-hlung\">Erstellen eines Word-Dokuments, das irgendwie geartete Platzhalter f&uuml;r die einzuf&uuml;genden Daten enth&auml;lt.<\/li>\n<li class=\"aufz-hlung\">Zuweisen der Inhalte der Datenherkunft zu den Platzhaltern im Dokument.<\/li>\n<\/ul>\n<p><b>Der Seriendruck-Assistent<\/b><\/p>\n<p>Der Seriendruck-Assistent dieses Beitrags kann auf zweierlei Arten eingesetzt werden: Erstens k&ouml;nnen Sie ihn nat&uuml;rlich in eigene Anwendungen einbauen, wenn diese eine Funktion zum Erstellen von Serienbriefen mitliefern soll. Zweitens k&ouml;nnen Sie ihn als Access-Add-In in Access integrieren, sodass dieser in jeder beliebigen Anwendung zur Verf&uuml;gung steht. Sie k&ouml;nnen dann also beispielsweise Ihre Adressverwaltung &ouml;ffnen, die bis dato gar keine Seriendruckfunktion enthielt, und auf Basis beliebiger Tabellen oder Abfragen Serienbriefdokumente f&uuml;llen.<\/p>\n<p><b>Add-In installieren<\/b><\/p>\n<p>Schauen wir uns zun&auml;chst an, wie der Serienbrief-Assistent als Add-In funktioniert. Sie m&uuml;ssen dazu zun&auml;chst die Datei <b>aiuSeriendruck.mda <\/b>aus dem Download zu diesem Beitrag in ein beliebiges Verzeichnis kopieren. Dann starten Sie Access und &ouml;ffnen eine Datenbank Ihrer Wahl. Unter Access 2007 finden Sie im Ribbon unter <b>Datenbanktools|Datenbanktools|Add-Ins|Add-In-Manager <\/b>das Werkzeug, um Add-Ins zu installieren. Im Dialog <b>Add-In-Manager <\/b>klicken Sie auf die Schaltfl&auml;che <b>Hinzuf&uuml;gen&#8230; <\/b>(siehe Bild 1) und w&auml;hlen im folgenden <b>Datei &ouml;ffnen<\/b>-Dialog die Datei <b>aiuSeriendruck.mda <\/b>aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Hinzuf&uuml;gen eines Access-Add-Ins<\/span><\/b><\/p>\n<p>Anschlie&szlig;end finden Sie unter Access 2007 in der Ribbon-Liste <b>Add-Ins <\/b>einen neuen Eintrag namens <b>aiuSeriendruck <\/b>(siehe Bild 2).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Aufrufen des Seriendruck-Assistenten <\/span><\/b><\/p>\n<p>Unter Access 2003 und &auml;lter finden Sie die M&ouml;glichkeit zum Installieren und Aufrufen des Assistenten &uuml;brigens unter dem Men&uuml;eintrag <b>Extras|Add-Ins<\/b>.<\/p>\n<p><b>Vorbereitung<\/b><\/p>\n<p>Bevor Sie den Seriendruck-Assistenten aufrufen, m&uuml;ssen Sie nur eine Voraussetzung schaffen: Sie ben&ouml;tigen eine Tabelle oder Abfrage, die alle zum F&uuml;llen des Seriendruck-Dokuments n&ouml;tigen Daten enth&auml;lt. Insbesondere gilt das f&uuml;r Tabellen, die Daten aus verkn&uuml;pften Tabellen enthalten. Dies betrifft etwa den klassischen Fall der Anrede: Diese wird oft in einer Lookup-Tabelle namens <b>tblAnreden <\/b>gespeichert, in der eigentlichen <b>Adresstabelle <\/b>befindet sich dann ein Nachschlagefeld zur Auswahl der richtigen Anrede (siehe Bild 3). Die Tabelle <b>tblAdressen <\/b>allein ist hier nicht als Datenquelle f&uuml;r den Seriendruck zu gebrauchen, da das Feld <b>AnredeID <\/b>nur eine Zahl, aber keinen Ausdruck wie <b>Herrn <\/b>oder <b>Frau <\/b>enth&auml;lt. Dem Seriendruck-Assistenten ist aber schon Gen&uuml;ge getan, wenn Sie die Daten der beiden Tabellen in einer einfachen Abfrage wie in Bild 4 zusammenfassen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Typischer Fall einer Adressen- und einer Anreden-Tabelle<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Diese Abfrage ist eine prima Datenquelle f&uuml;r einen Serienbrief.<\/span><\/b><\/p>\n<p><b>Seriendruck durchf&uuml;hren<\/b><\/p>\n<p>Nun kann es endlich losgehen: Starten Sie <b>aiuSeriendruck <\/b>und schauen Sie sich das einzige Formular des Assistenten an, das wie in Bild 5 aussieht.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Der Serienbrief-Assistent<\/span><\/b><\/p>\n<p>Im ersten Schritt des Assistenten w&auml;hlen Sie die Datenquelle f&uuml;r den Seriendruck aus. Der Assistent bietet alle Tabellen und Abfragen in einer Auswahlliste an &#8211; lediglich eventuell zur Ansicht freigegebene Systemtabellen, die mit <b>MSys&#8230; <\/b>beginnen, werden ausgeblendet (siehe Bild 6).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Auswahl der Datenquelle f&uuml;r den Serienbrief<\/span><\/b><\/p>\n<p>Nach der Auswahl der Datenquelle geschieht etwas im Hintergrund: <b>aiuSeriendruck <\/b>speichert die Daten der Datenquelle in einer tempor&auml;ren Tabelle, erg&auml;nzt diese um ein Feld zur manuellen Auswahl der Datens&auml;tze und zeigt diese im Bereich <b>Schritt 2 <\/b>des Assistenten an (siehe Bild 7).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Auswahl der Datens&auml;tze, mit denen der Serienbrief gef&uuml;llt werden soll<\/span><\/b><\/p>\n<p>Hier liefert <b>aiuSeriendruck <\/b>deutlich mehr M&ouml;glichkeiten als die Seriendruck-Funktion von Word. Sie k&ouml;nnen Folgendes erledigen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Einzelne Eintr&auml;ge per Klick auf das jeweilige Kontrollk&auml;stchen aus- oder abw&auml;hlen,<\/li>\n<li class=\"aufz-hlung\">die angezeigten Eintr&auml;ge filtern, indem Sie die bekannten Filterm&ouml;glichkeiten der Datenblattansicht verwenden,<\/li>\n<li class=\"aufz-hlung\">die jeweils angezeigten (und gegebenenfalls gefilterten) Datens&auml;tze mit einem Klick auf die Schaltfl&auml;che <b>Auswahl markieren <\/b>als ausgew&auml;hlt markieren, <\/li>\n<li class=\"aufz-hlung\">die jeweils angezeigten (und gegebenenfalls gefilterten) Datens&auml;tze mit einem Klick auf die Schaltfl&auml;che <b>Ausgew&auml;hlte abw&auml;hlen <\/b>als nicht ausgew&auml;hlt markieren,<\/li>\n<li class=\"aufz-hlung\">mit den Schaltfl&auml;chen <b>Alle ausw&auml;hlen <\/b>oder <b>Alle abw&auml;hlen <\/b>alle Datens&auml;tze als ausgew&auml;hlt beziehungsweise nicht ausgew&auml;hlt markieren.<\/li>\n<\/ul>\n<p>Au&szlig;erdem k&ouml;nnen Sie mit der Optionsgruppe <b>Anzeigen <\/b>festlegen, ob das Datenblatt alle Datens&auml;tze anzeigen soll oder nur die markierten oder nur die nicht markierten.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Word-Dokument vorbereiten<\/p>\n<p>Nachdem der Benutzer die Daten f&uuml;r den Serienbrief mit den vorhandenen Hilfsmitteln vorbereitet hat, kann er sich dem Ausgangsdokument zuwenden. Hier gibt es zun&auml;chst drei M&ouml;glichkeiten, ein Dokument auszuw&auml;hlen (siehe Bild 8). Diese drei sind &uuml;ber die folgenden Schaltfl&auml;chen zu erreichen:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic010.png\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Auswahl einer Option zum Erstellen oder &Ouml;ffnen eines Dokuments als Seriendruck-Vorlage<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Ein bestehendes Dokument ausw&auml;hlen<\/b>: &Ouml;ffnet einen <b>Datei &ouml;ffnen<\/b>-Dialog und erlaubt die Auswahl einer beliebigen Word-Datei.<\/li>\n<li class=\"aufz-hlung\"><b>Leeres Dokument erstellen<\/b>: Diese Schaltfl&auml;che &ouml;ffnet Word und erstellt ein neues, leeres Dokument auf Basis der Vorlage <b>Normal.dot <\/b>beziehungsweise <b>Normal.dotx<\/b>. Sie k&ouml;nnen gleich an Ort und Stelle beginnen, die gew&uuml;nschten Platzhalter f&uuml;r den Seriendruck einzuf&uuml;gen. Wie das geht, besprechen wir weiter unten.<\/li>\n<li class=\"aufz-hlung\"><b>Dokument auf Basis einer Vorlage erstellen<\/b>: Nat&uuml;rlich k&ouml;nnen Sie auch eine Dokumentvorlage als Ausgangspunkt f&uuml;r den Seriendruck verwenden. Auch dieses w&auml;hlen Sie zun&auml;chst mit einem entsprechenden Dialog aus, und auch hier f&uuml;gen Sie gleich die Platzhalter f&uuml;r den Seriendruck ein (Sie k&ouml;nnen dies aber auch sp&auml;ter noch erledigen).<\/li>\n<\/ul>\n<p>Nachdem Sie auf eine der drei Arten das gew&uuml;nschte Dokument ausgew&auml;hlt haben, sehen Sie dieses entweder schon vor sich (bei Bet&auml;tigung der zweiten oder dritten Schaltfl&auml;che) oder Sie k&ouml;nnen das Dokument, dessen Dateiname nun im Textfeld <b>Ausgangsdokument <\/b>angezeigt wird, mit einem Klick auf die Schaltfl&auml;che <b>Bearbeiten <\/b>in Word &ouml;ffnen.<\/p>\n<p><b>Platzhalter einf&uuml;gen<\/b><\/p>\n<p>F&uuml;r das nun ge&ouml;ffnete Word-Dokument gibt es eine ganz wichtige Regel: Sie m&uuml;ssen es mit dem Kontextmen&uuml;eintrag <b>Alle Platzhalter gesetzt <\/b>wieder schlie&szlig;en.<\/p>\n<p>Davon abgesehen brauchen Sie eigentlich nur die Einf&uuml;gemarke an der Stelle zu positionieren, an der Sie einen Platzhalter einf&uuml;gen m&ouml;chten, mit der rechten Maustaste das Kontextmen&uuml; aufzurufen und den einzuf&uuml;genden Platzhalter auszuw&auml;hlen (siehe Bild 9).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Einf&uuml;gen von Platzhaltern per Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Dort finden Sie nach getaner Arbeit auch den Eintrag <b>Alle Platzhalter gesetzt<\/b>, mit dem die Arbeiten am Dokument beendet werden m&uuml;ssen.<\/p>\n<p><b>Seriendruck starten<\/b><\/p>\n<p>Nach getaner Arbeit brauchen Sie, wenn Sie m&ouml;chten, nur noch ein Zieldokument f&uuml;r den Seriendruck auszuw&auml;hlen. Dies erledigen Sie mit der Schaltfl&auml;che mit den drei Punkten (&#8230;). Der Name der per <b>Datei speichern<\/b>-Dialog ermittelten Datei wird anschlie&szlig;end in das Textfeld <b>Zieldatei <\/b>eingetragen. Mit einem Klick auf die Schaltfl&auml;che <b>Seriendruck starten <\/b>sto&szlig;en Sie den Seriendruck schlie&szlig;lich an. Sollten Sie nicht vorab einen Speichernamen f&uuml;r die zu erstellende Datei angegeben haben, bleibt das erstellte Dokument einfach ge&ouml;ffnet, sodass Sie selbst das Speichern &uuml;bernehmen k&ouml;nnen (siehe Bild 10).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic011.png\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Ansto&szlig;en des Seriendrucks<\/span><\/b><\/p>\n<p>Als Ergebnis erhalten Sie je nach der Anzahl der ausgew&auml;hlten Datens&auml;tze ein Dokument mit der entsprechenden Anzahl Seiten &#8211; fertig!<\/p>\n<p><b>Technische Hintergr&uuml;nde<\/b><\/p>\n<p>Die Beispielanwendung enth&auml;lt einige interessante Techniken, die wir uns auf den folgenden Seiten ansehen werden. Beginnen wir mit dem Datenmodell der Datenbank: Das geht schnell, denn die Anwendung kommt als Add-In fast ohne Tabellen aus. Die einzige, die wir ben&ouml;tigen, wird tempor&auml;r angelegt und mit der Auswahl einer neuen Datenquelle wieder gel&ouml;scht.<\/p>\n<p>Nur f&uuml;r die Installation des Add-Ins ist die Tabelle <b>USysRegInfo <\/b>interessant, die wie in Bild 11 aussieht und beim Installieren des Add-Ins entsprechend der obigen Beschreibung ausgelesen wird. Die erste Zeile gibt an, welche VBA-Funktion beim Anklicken des Men&uuml;eintrags unter <b>Add-Ins <\/b>aufgerufen wird, die zweite Zeile den Namen der Add-In-Datei und die dritte den Text, der im Add-In-Manager angezeigt wird.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic012.png\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Diese Informationen werden zur Installation des Add-Ins ben&ouml;tigt.<\/span><\/b><\/p>\n<p>Die Funktion <b>Autostart() <\/b>&ouml;ffnet schlicht und einfach das Hauptformular des Add-Ins:<\/p>\n<pre>Public Function Autostart()\r\n  DoCmd.OpenForm &quot;frmSerienbrief&quot;, WindowMode:=acDialog\r\nEnd Function<\/pre>\n<p><b>Quelltabelle ausw&auml;hlen<\/b><\/p>\n<p>Beim &Ouml;ffnen des Formulars <b>frmSerienbrief <\/b>l&ouml;st das Ereignis <b>Beim &Ouml;ffnen <\/b>die folgende Ereignisprozedur aus. Diese weist der Datensatzherkunft des Kombinationsfeldes <b>cboSourceObject <\/b>eine Abfrage zu, die alle als Datenquelle f&uuml;r den Seriendruck infrage kommenden Tabellen und Abfragen aus der Systemtabelle <b>MSysObjects <\/b>ausliest. Die zweite Anweisung dieser Prozedur ruft die Routine <b>SteuerelementAktualisieren <\/b>auf, die den Inhalt einiger Steuerelemente pr&uuml;ft und in Abh&auml;ngigkeit davon andere Steuerelemente aktiviert oder deaktiviert (s. Listing 1).<\/p>\n<p class=\"kastentabelleheader\">Listing 1: F&uuml;llen der Datenquellen-Liste beim &Ouml;ffnen des Formulars<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n  Me!cboSourceObject.RowSource = &quot;SELECT Name FROM MSysObjects IN ''&quot; &amp; dbs.Name _\r\n  &amp; &quot;'' WHERE (Type=1 Or Type=5) AND Name NOT LIKE ''MSys*'' AND Name NOT LIKE ''~*'' &quot;\r\n  SteuerelementeAktualisieren\r\nEnd Sub<\/pre>\n<p><b>Daten der Quelltabelle anzeigen<\/b><\/p>\n<p>Wenn der Benutzer die Quelle f&uuml;r den Seriendruck ausgew&auml;hlt hat, beginnt die Anwendung mit einer Menge Arbeit. Den Startschuss markiert das Ausl&ouml;sen der Ereignisprozedur <b>cblSourceObject_AfterUpdate<\/b> (s. Listing 2). Diese leert als Erstes das Unterformularsteuerelement <b>sfmAdressen<\/b>, das sp&auml;ter die Daten anzeigen soll (nur f&uuml;r den Fall, dass zuvor schon eine andere Quelle ausgew&auml;hlt wurde).<\/p>\n<p class=\"kastentabelleheader\">Listing 2: Anzeige der Daten der Quelltabelle <\/p>\n<pre>Private Sub cboSourceObject_AfterUpdate()\r\n  Me!sfmAdressen.SourceObject = &quot;&quot;\r\n  If Not Len(Me!cboSourceObject) = 0 Then\r\n    TempTabelleErstellen (Me!cboSourceObject)\r\n    With Me!sfmAdressen\r\n      .SourceObject = &quot;Table.tblSerienbrief_Temp&quot;\r\n      .Form.Controls(&quot;Serienbrief&quot;).ColumnOrder = 0\r\n      .Form.DatasheetFontHeight = 9\r\n    End With\r\n  End If\r\n  Call SteuerelementeAktualisieren\r\nEnd Sub<\/pre>\n<p>Nach einer Pr&uuml;fung, ob tats&auml;chlich ein Eintrag ausgew&auml;hlt wurde, ruft die Prozedur eine weitere Prozedur namens <b>TempTabelleErstellen <\/b>auf (s. Listing 3) und &uuml;bergibt als einzigen Parameter den Namen der Quelltabelle oder -abfrage. Nachdem diese ihren Dienst verrichtet hat (mehr dazu weiter unten), liegt eine tempor&auml;re Tabelle namens <b>tblSerienbrief_Temp <\/b>vor.<\/p>\n<p class=\"kastentabelleheader\">Listing 3: Anzeige der Daten der Quelltabelle <\/p>\n<pre>Public Sub TempTabelleErstellen(strSource As String)\r\n  Dim tdf As DAO.TableDef\r\n  Dim fld As DAO.Field\r\n  Dim prp As DAO.Property\r\n  On Error Resume Next\r\n  dbc.Execute &quot;DROP TABLE tblSerienbrief_Temp&quot;, dbFailOnError\r\n  On Error GoTo 0\r\n  dbc.Execute &quot;SELECT * INTO tblSerienbrief_Temp FROM &quot; &amp; strSource &amp; &quot; IN ''&quot; &amp; dbs.Name _\r\n  &amp; &quot;''&quot;, dbFailOnError\r\n  dbc.Execute &quot;ALTER TABLE tblSerienbrief_Temp ADD Serienbrief BIT&quot;, dbFailOnError\r\n  dbc.Execute &quot;UPDATE tblSerienbrief_Temp SET Serienbrief = TRUE&quot;, dbFailOnError\r\n  Set tdf = dbc.TableDefs(&quot;tblSerienbrief_Temp&quot;)\r\n  Set fld = tdf.Fields(&quot;Serienbrief&quot;)\r\n  Set prp = fld.CreateProperty(&quot;DisplayControl&quot;, DB_INTEGER, 106, True)\r\n  On Error Resume Next\r\n  fld.Properties.Delete &quot;DisplayControl&quot;\r\n  On Error GoTo 0\r\n  fld.Properties.Append prp\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Unterformularen kann man auch eine Tabelle oder Abfrage als Herkunftsobjekt zuweisen, man muss dann allerdings je nach Typ den Ausdruck <b>Table.&lt;Tabellenname&gt; <\/b>beziehungsweise <b>Query.&lt;Tabellenname&gt; <\/b>voranstellen. In unserem Fall ist dies einfach: Wir wissen, dass wir mit einer Tabelle namens <b>tblSerienbrief_Temp <\/b>arbeiten, also lautet das neue Herkunftsobjekt <b>Table.tblSerienbrief_Temp<\/b>.<\/p>\n<p>Anschlie&szlig;end geschehen noch zwei wichtige Schritte: Die per Code in der Prozedur <b>TempTabelleErstellen <\/b>erzeugte Tabelle besitzt unter anderem ein <b>Ja\/Nein<\/b>-Feld, mit dem der Benutzer individuell ausw&auml;hlen soll, welche Datens&auml;tze beim Seriendruck ber&uuml;cksichtigt werden sollen. Dieses ist das letzte Feld der dynamisch erzeugten tempor&auml;ren Tabelle, soll aber als erste Spalte angezeigt werden, damit der Benutzer nicht unn&ouml;tig scrollen muss. Dazu stellen wir die Eigenschaft <b>ColumnIndex <\/b>dieses Feldes auf den Wert <b>0 <\/b>ein &#8211; alle anderen Felder rutschen so einen Platz weiter nach rechts. Au&szlig;erdem zeigt Access die Daten in Datenbl&auml;ttern standardm&auml;&szlig;ig in Schriftgr&ouml;&szlig;e 11 an. Damit das Datenblatt zu den &uuml;brigen Steuerelementen passt, stellen wir diese mit der Eigenschaft <b>DatasheetFontHeight <\/b>auf Schriftgr&ouml;&szlig;e <b>9 <\/b>ein (da wir mit einer Tabelle als Herkunftsobjekt des Unterformulars arbeiten, l&auml;sst sich dies nicht anderweitig festlegen). Schlie&szlig;lich ruft auch diese Prozedur die Routine <b>SteuerelementeAktualisieren <\/b>auf.<\/p>\n<p><b>Tempor&auml;re Tabelle erstellen<\/b><\/p>\n<p>Das Erstellen der tempor&auml;ren Tabelle erfolgt in der Prozedur <b>TempTabelleErstellen<\/b>, welche den Namen der ausgew&auml;hlten Tabelle oder Abfrage als Parameter erwartet. Im ersten Schritt l&ouml;scht diese Prozedur eine eventuell noch vorhandene Tabelle namens <b>tblSerienbrief_Temp<\/b>, da diese gleich neu erstellt wird. Dies erledigt eine einfache <b>SELECT INTO<\/b>-Abfrage, die eine neue Tabelle auf Basis der angegebenen Tabelle oder Abfrage erstellt. Wichtig ist hier, da wir das erste Mal in dieser Anwendung DAO-Elemente einsetzen, dass wir sowohl auf die Tabellen beziehungsweise Abfragen der Datenbank zugreifen, die das Add-In aufgerufen hat, als auch auf die in der Add-In-Datenbank erstellte Tabelle <b>tblSerienbrief_Temp <\/b>zugreifen m&uuml;ssen. Dazu haben wir zwei kleine Funktionen namens <b>dbc <\/b>und <b>dbs <\/b>im Modul <b>mdlDatabase <\/b>untergebracht, welche &uuml;ber die Eigenschaften <b>CodeDB <\/b>und <b>CurrentDB <\/b>den Verweis auf die jeweils ben&ouml;tigte Datenbank liefern und diesen f&uuml;r weitere Zugriffe zwischenspeichern:<\/p>\n<pre>Dim m_dbc As DAO.Database\r\nDim m_dbs As DAO.Database\r\nPublic Function dbc() As Database\r\n  If m_dbc Is Nothing Then\r\n    Set m_dbc = CodeDb\r\n  End If\r\n  Set dbc = m_dbc\r\nEnd Function\r\nPublic Function dbs() As Database\r\n  If m_dbs Is Nothing Then\r\n    Set m_dbs = CurrentDb\r\n  End If\r\n  Set dbs = m_dbs\r\nEnd Function<\/pre>\n<p>Diese beiden Funktionen kommen gleich in der Prozedur <b>TempTabelleErstellen <\/b>zum Einsatz. Die Tabelle wird zun&auml;chst &uuml;ber die <b>Execute<\/b>-Methode des von der Funktion <b>dbc <\/b>zur&uuml;ckgelieferten Verweises auf das <b>Database<\/b>-Objekt des Add-Ins gel&ouml;scht. Die erneute Erstellung dieser Tabelle &uuml;ber die <b>SELECT INSERT<\/b>-Abfrage verwendet gleich beide <b>Database<\/b>-Objekte: Das erste f&uuml;hrt die Abfrage aus, das andere liefert den Namen der Datenbank, aus der die Daten stammen.<\/p>\n<p>Danach folgen noch ein paar Erg&auml;nzungen: So erh&auml;lt die Tabelle <b>tblSerienbrief_Temp <\/b>noch ein <b>Ja\/Nein<\/b>-Feld namens <b>Serienbrief<\/b>, das zum Ausw&auml;hlen der Datens&auml;tze f&uuml;r den Seriendruck dient. Dieses Feld erh&auml;lt auch gleich f&uuml;r alle Datens&auml;tze den Wert <b>True<\/b>. Und damit das <b>Ja\/Nein<\/b>-Feld anschlie&szlig;end auch noch gut aussieht und der Benutzer die Datens&auml;tze &uuml;ber ein Kontrollk&auml;stchen statt der manuellen Eingabe der Werte <b>0 <\/b>und <b>-1 <\/b>ausw&auml;hlen kann, legt die Prozedur noch eine <b>Property <\/b>namens <b>DisplayControl <\/b>an und weist ihr den Wert <b>106 <\/b>zu, was der Konstanten <b>acCheckBox <\/b>und somit einem Kontrollk&auml;stchen entspricht.<\/p>\n<p><b>Daten f&uuml;r den Seriendruck ausw&auml;hlen<\/b><\/p>\n<p>Kommen wir zu Schritt 2 des Assistenten. Dort w&auml;hlt der Benutzer mit einigen Hilfsmitteln des Add-Ins die Datens&auml;tze f&uuml;r den Seriendruck aus. Beginnen wir mit dem einfacheren Teil &#8211; der Optionsgruppe <b>ogrAnzeige<\/b>. Diese l&ouml;st nach der Aktualisierung die folgende Ereignisprozedur aus und stellt je nach der Auswahl des Benutzers den Filter des Unterformulars so ein, dass er entweder alle, alle markierten oder alle nicht markierten Datens&auml;tze anzeigt:<\/p>\n<pre>Private Sub ogrAnzeige_AfterUpdate()\r\n  Select Case Me!ogrAnzeige\r\n  Case 1\r\n  Me!sfmAdressen.Form.Filter = &quot;&quot;\r\n  Me!sfmAdressen.Form.FilterOn = False\r\n  Case 2\r\n  Me!sfmAdressen.Form.Filter = _\r\n  &quot;Serienbrief = True&quot;\r\n  Me!sfmAdressen.Form.FilterOn = True\r\n  Case 3\r\n  Me!sfmAdressen.Form.Filter = _\r\n  &quot;Serienbrief = False&quot;\r\n  Me!sfmAdressen.Form.FilterOn = True\r\n  End Select\r\nEnd Sub<\/pre>\n<p>Die Schaltfl&auml;che <b>cmdAlleAbwaehlen <\/b>soll alle Datens&auml;tze abw&auml;hlen, also das Feld <b>Serienbrief <\/b>f&uuml;r alle Datens&auml;tze auf <b>False <\/b>einstellen. Die dazu verwendete <b>UPDATE<\/b>-Abfrage wird wiederum &uuml;ber die <b>Execute<\/b>-Methode des von der <b>dbc<\/b>-Funktion gelieferten <b>Database<\/b>-Objekts aufgerufen.<\/p>\n<p>Anschlie&szlig;end aktualisiert die <b>Requery<\/b>-Methode den Inhalt des Unterformulars:<\/p>\n<pre>Private Sub cmdAlleAbwaehlen_Click()\r\n  dbc.Execute &quot;UPDATE tblSerienbrief_Temp\r\n  SET Serienbrief = False&quot;, dbFailOnError\r\n  Me!sfmAdressen.Form.Requery\r\nEnd Sub<\/pre>\n<p>Die Schaltfl&auml;che <b>cmdAlleAuswaehlen <\/b>erledigt genau das Gegenteil: Sie stellt das Feld <b>Serienbrief <\/b>n&auml;mlich f&uuml;r alle Datens&auml;tze auf <b>True <\/b>ein. Die durch das Ereignis <b>Beim Klicken <\/b>ausgel&ouml;ste Prozedur sieht so aus:<\/p>\n<pre>Private Sub cmdAlleAuswaehlen_Click()\r\n  dbc.Execute &quot;UPDATE tblSerienbrief_Temp\r\n  SET Serienbrief = True&quot;, dbFailOnError\r\n  Me!sfmAdressen.Form.Requery\r\nEnd Sub<\/pre>\n<p>Wie bereits weiter oben erw&auml;hnt, stehen dem Benutzer die Filter- und Sortierm&ouml;glichkeiten der Datenblattansicht zur Verf&uuml;gung. Wenn er nun &uuml;ber verschiedene Filterkriterien der einzelnen Spalten die gew&uuml;nschten Datens&auml;tze im Datenblatt zur Anzeige gebracht hat, m&ouml;chte er diese Auswahl wahrscheinlich auch f&uuml;r die Weiterverwendung im Seriendruck nutzen. Dabei hilft die Schaltfl&auml;che <b>cmdAuswahlMarkieren <\/b>weiter, welche das Feld <b>Serienbrief <\/b>f&uuml;r alle aktuell angezeigten Datens&auml;tze auf <b>True <\/b>einstellt. Die f&uuml;r die verschiedenen Spalten eingestellten Filterkriterien lassen sich leicht &uuml;ber die Eigenschaft <b>Filter <\/b>des <b>Form<\/b>-Objekts des Unterformular-Steuerelements auslesen und in Form einer <b>WHERE<\/b>-Bedingung an eine <b>UPDATE<\/b>-Anweisung anh&auml;ngen, um die aktuell sichtbaren Datens&auml;tze anzupassen:<\/p>\n<pre>Private Sub cmdAuswahlMarkieren_Click()\r\n  Dim strFilter As String\r\n  strFilter = Me!sfmAdressen.Form.Filter\r\n  If Len(strFilter) &gt; 0 Then\r\n    strFilter = &quot; WHERE &quot; &amp; strFilter\r\n  End If\r\n  dbc.Execute &quot;UPDATE tblSerienbrief_Temp\r\n  SET Serienbrief = True &quot;\r\n  &amp; strFilter, dbFailOnError\r\n  Me!sfmAdressen.Form.Requery\r\nEnd Sub<\/pre>\n<p>Genau das Gegenteil erledigt die Schaltfl&auml;che <b>cmdMarkierteAbwaehlen<\/b>. Sie stellt das Feld <b>Serienbrief <\/b>f&uuml;r alle Datens&auml;tze auf <b>False <\/b>ein, die aktuell angezeigt werden:<\/p>\n<pre>Private Sub cmdMarkierteAbwaehlen_Click()\r\n  Dim strFilter As String\r\n  strFilter = Me!sfmAdressen.Form.Filter\r\n  If Len(strFilter) &gt; 0 Then\r\n    strFilter = &quot; WHERE &quot; &amp; strFilter\r\n  End If\r\n  dbc.Execute &quot;UPDATE tblSerienbrief_Temp\r\n  SET Serienbrief = False &quot; &amp; strFilter,\r\n  dbFailOnError\r\n  Me!sfmAdressen.Form.Requery\r\nEnd Sub<\/pre>\n<p>Bei der Betrachtung dieser beiden Prozeduren ist wichtig, dass beide sich nicht auf die aktuell nicht angezeigten Datens&auml;tze auswirken! Wenn der Benutzer also mit den Filterkriterien Datens&auml;tze ausblendet, die schon f&uuml;r den Seriendruck ausgew&auml;hlt wurden, dann werden diese durch einen Klick auf die Schaltfl&auml;che <b>Ausgew&auml;hlte abw&auml;hlen <\/b>nicht aus der Auswahl herausgenommen.<\/p>\n<p><b>Seriendruck-Ausgangsdokument vorbereiten<\/b><\/p>\n<p>Nun entwickeln wir die verschiedenen M&ouml;glichkeiten, ein Ausgangsdokument f&uuml;r den Seriendruck auszuw&auml;hlen. Die erste Variante ist die einfachste, da sie nur zur Auswahl dient und nicht gleich das Dokument zum Vorbereiten &ouml;ffnet. Die Schaltfl&auml;che <b>Ein bestehendes Dokument ausw&auml;hlen <\/b>l&ouml;st folgende Ereignisprozedur aus:<\/p>\n<pre>Private Sub cmdDokumentAuswaehlen_Click()\r\n  Me!txtDokument = OpenFileName(\r\n  CurrentProject.Path, &quot;Word-Dokument mit\r\n  Platzhaltern ausw&auml;hlen&quot;, &quot;Word-Dokument\r\n  (*.doc, *.docx)&quot;)\r\nEnd Sub<\/pre>\n<p>Die Routine ruft lediglich die Funktion <b>OpenFileName <\/b>auf, die einen <b>Datei &ouml;ffnen<\/b>-Dialog anzeigt und die Auswahl einer Datei erlaubt. Diese Funktion finden Sie im Modul <b>mdlTools <\/b>der Add-In-Datenbank. Das Ergebnis dieser Funktion landet gleich im Textfeld <b>txtDokument<\/b>.<\/p>\n<p><b>Obligatorisch: Verweis auf die Word-Bibliothek<\/b><\/p>\n<p>Wenn Sie mit <b>Early Binding <\/b>arbeiten m&ouml;chten, was sich zumindest f&uuml;r den Entwicklungsprozess anbietet, ben&ouml;tigen Sie f&uuml;r die folgenden Schritte einen Verweis auf die Bibliothek <b>Microsoft Word x.0 Object Library<\/b>.<\/p>\n<p><b>Leeres Dokument erstellen<\/b><\/p>\n<p>F&uuml;r die Prozedur, die durch einen Klick auf die Schaltfl&auml;che <b>Leeres Dokument erstellen <\/b>ausgel&ouml;st wird, brauchen wir noch zwei modulweit g&uuml;ltige Variablen, welche die Verweise auf die noch zu &ouml;ffnende Word-Instanz und das zu erstellende Dokument enthalten. Diese sehen so aus:<\/p>\n<pre>Dim objWord As Word.Application\r\nDim objDocument As Word.Document<\/pre>\n<p>Das Anlegen eines neuen Dokuments ist scheinbar schnell erledigt, wie die folgende Prozedur zeigt. Allerdings steckt darin noch der unscheinbare Aufruf der Prozedur <b>EditPopup<\/b>, die kurz gefasst f&uuml;r das Hinzuf&uuml;gen der Kontextmen&uuml;eintr&auml;ge zum Einf&uuml;gen der Platzhalter verantwortlich ist und weiter unten beschrieben wird:<\/p>\n<pre>Private Sub cmdNeuesDokument_Click()\r\n  Set objWord = _\r\n  CreateObject(&quot;Word.Application&quot;)\r\n  Set objDocument = objWord.Documents.Add()\r\n  Call EditPopup\r\n  objWord.Visible = True\r\n  objWord.Activate\r\nEnd Sub<\/pre>\n<p>Etwas komplizierter ist die Anzeige eines Dokuments auf Basis einer Dokumentvorlage. Sie verwendet die bereits bekannte Funktion <b>OpenFileName<\/b>, um die Vorlage auszuw&auml;hlen. Damit diese auch gleich den aktuell eingestellten Ordner f&uuml;r Dokumentvorlagen anzeigt, muss vorher bereits eine Word-Instanz erstellt werden. Die Option <b>objWord.Options.DefaultFilePath(wdUserTemplatesPath) <\/b>liefert genau diesen Ordner. Falls der Benutzer eine Vorlage ausw&auml;hlt, wird diese gleich ge&ouml;ffnet &#8211; nicht, ohne gleich noch die oben erw&auml;hnten und im Anschluss beschriebenen Kontextmen&uuml;-Erweiterungen zu erstellen (s. Listing 4).<\/p>\n<p class=\"kastentabelleheader\">Listing 4: Erstellen eines neuen Dokuments auf Basis einer Dokumentvorlage<\/p>\n<pre>Private Sub cmdNeuVonVorlage_Click()\r\n  Dim strTemplate As String\r\n  Set objWord = CreateObject(&quot;Word.Application&quot;)\r\n  strTemplate = OpenFileName(objWord.Options.DefaultFilePath(wdUserTemplatesPath), _\r\n  &quot;Vorlage ausw&auml;hlen&quot;, &quot;Word 2007 (*.dotx,*.dotm)|Word 2003 und &auml;lter (*.dot)&quot;)\r\n  If Len(strTemplate) = 0 Then\r\n    MsgBox &quot;Sie haben keine Vorlage ausgew&auml;hlt. Der Vorgang wird abgebrochen.&quot;\r\n    objWord.Quit\r\n    Set objWord = Nothing\r\n    Exit Sub\r\n  End If\r\n  Set objDocument = objWord.Documents.Add(strTemplate)\r\n  Call EditPopup\r\n  objWord.Visible = True\r\n  objWord.Activate\r\nEnd Sub<\/pre>\n<p><b>Bereits ausgew&auml;hltes Dokument bearbeiten<\/b><\/p>\n<p>Ob Sie nun ein neues Dokument anlegen oder ein vorhandenes verwenden &#8211; Sie k&ouml;nnen in jedem Falle jederzeit &auml;nderungen am Dokument und damit auch an den darin verwendeten Platzhaltern vornehmen. Daf&uuml;r sorgt die Schaltfl&auml;che <b>Bearbeiten<\/b>, die das im Textfeld <b>txtDokument <\/b>angegebene Dokument erneut &ouml;ffnet und mithilfe der Prozedur <b>EditPopup <\/b>die f&uuml;r das Einf&uuml;gen von Platzhaltern notwendigen Kontextmen&uuml;eintr&auml;ge anlegt:<\/p>\n<pre>Private Sub cmdBearbeiten_Click()\r\n  If Len(Nz(Me.txtDokument)) = 0 Then\r\n    Exit Sub\r\n  End If\r\n  Set objWord = _\r\n  CreateObject(&quot;Word.Application&quot;)\r\n  Set objDocument = GetObject(Me.txtDokument)\r\n  Call EditPopup\r\n  objWord.Visible = True\r\n  objWord.Activate\r\nEnd Sub<\/pre>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Kontextmen&uuml;s in Word anpassen<\/p>\n<p>Normalerweise ist das Anlegen oder &auml;ndern von Kontextmen&uuml;s, deren Eintr&auml;ge benutzerdefinierte Funktionen aufrufen sollen, kein Problem: Sie f&uuml;gen &uuml;ber das <b>CommandBars<\/b>-Objektmodell einfach die gew&uuml;nschten Elemente hinzu und geben f&uuml;r die Eigenschaft <b>OnAction <\/b>den Namen der Funktion an, die ausgel&ouml;st werden soll.<\/p>\n<p>Wenn Sie aber von Access (oder einer anderen externen Anwendung) die Men&uuml;s von Word (oder einer anderen Office-Anwendung) anpassen und mit benutzerdefinierten Funktionen ausstatten m&ouml;chten, die sich in der Anwendung befinden, welche die Kontextmen&uuml;s anpasst, m&uuml;ssen Sie ein wenig tiefer in die Tasche greifen.<\/p>\n<p>Zun&auml;chst ben&ouml;tigen wir zwei Variablen, welche zwei Objekte auf Basis des gleichen Klassenmoduls deklarieren, das wir gleich erl&auml;utern werden:<\/p>\n<pre>Dim WithEvents objCommandbarText As clsCommandbar\r\nDim WithEvents objCommandbarTableText As clsCommandbar<\/pre>\n<p>Beide sind mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert, was bedeutet, dass diese Ereignisse ausl&ouml;sen, auf die wir mit entsprechenden Ereignisprozeduren reagieren k&ouml;nnen.<\/p>\n<p><b>Kontextmen&uuml;s in Word anpassen<\/b><\/p>\n<p>Die oben bereits mehrfach erw&auml;hnte Prozedur <b>EditPopup <\/b>hat nur eine einzige Aufgabe: Sie soll einigen Word-Kontextmen&uuml;s Eintr&auml;ge hinzuf&uuml;gen, und zwar je einen f&uuml;r jedes Feld der Datenquelle f&uuml;r den Seriendruck und noch einen zus&auml;tzlichen, mit dem der Benutzer das Vorbereiten des Seriendruckdokuments kontrolliert abschlie&szlig;en kann.<\/p>\n<p>F&uuml;r das Anlegen eines Kontextmen&uuml;eintrags f&uuml;r jedes Feld der Datenquelle verwenden wir ein <b>Recordset<\/b>-Objekt, das auf dieser Datenquelle basiert (aber wegen des Kriteriums keine Datens&auml;tze liefert). Daraus entnimmt die Prozedur in einer <b>For Each<\/b>-Schleife alle Feldnamen und legt die entsprechenden Kontextmen&uuml;eintr&auml;ge an.<\/p>\n<p>Es werden zwei Kontextmen&uuml;s erweitert, und zwar <b>Text <\/b>und <b>Table Text<\/b>. F&uuml;r jedes Kontextmen&uuml; wird ein Objekt des Typs <b>clsCommandbar <\/b>angelegt. Diesem weisen wir dann je eine Referenz auf das betroffene Kontextmen&uuml; und das ge&ouml;ffnete Word-Dokument zu und rufen dann f&uuml;r jedes Feld der Datenquelle je einmal die Methode <b>AddCommandbarButton <\/b>mit dem in eckigen Klammern eingefassten Feldnamen auf.<\/p>\n<p>Schlie&szlig;lich wird die Methode <b>AddCommandbarButton <\/b>noch einmal f&uuml;r jedes der beiden betroffenen Kontextmen&uuml;s mit dem Wert <b>Alle Platzhalter gesetzt <\/b>als Parameter aufgerufen (s. Listing 5).<\/p>\n<p class=\"kastentabelleheader\">Listing 5: Anlegen der Kontextmen&uuml;erweiterungen in Word<\/p>\n<pre>Private Sub EditPopup()\r\n  Dim rst As DAO.Recordset\r\n  Dim fld As DAO.Field\r\n  Set rst = dbc.OpenRecordset(&quot;SELECT * FROM tblSerienbrief_Temp WHERE 1=2&quot;)\r\n  Set objCommandbarText = New clsCommandbar\r\n  Set objCommandbarText.Commandbar = objWord.CommandBars(&quot;Text&quot;)\r\n  Set objCommandbarText.Document = objDocument\r\n  For Each fld In rst.Fields\r\n    objCommandbarText.AddCommandbarButton &quot;[&quot; &amp; fld.Name &amp; &quot;]&quot;\r\n  Next fld\r\n  objCommandbarText.AddCommandbarButton &quot;Alle Platzhalter gesetzt&quot;\r\n  Set objCommandbarTableText = New clsCommandbar\r\n  Set objCommandbarTableText.Commandbar = objWord.CommandBars(&quot;Table Text&quot;)\r\n  Set objCommandbarTableText.Document = objDocument\r\n  For Each fld In rst.Fields\r\n    objCommandbarTableText.AddCommandbarButton &quot;[&quot; &amp; fld.Name &amp; &quot;]&quot;\r\n  Next fld\r\n  objCommandbarTableText.AddCommandbarButton &quot;Alle Platzhalter gesetzt&quot;\r\nEnd Sub<\/pre>\n<p><b>Name eines Kontextmen&uuml;s herausfinden<\/b><\/p>\n<p>Das Best&uuml;cken der Kontextmen&uuml;s mit den Eintr&auml;gen zum Einf&uuml;gen der Platzhalter bringt ein Problem mit sich: Wie finde ich die Namen der betroffenen Kontextmen&uuml;s heraus, die beispielsweise beim Klick auf einen einfachen Absatz, in ein Textfeld oder in eine Tabelle angezeigt werden<\/p>\n<p>Dabei handelt es sich n&auml;mlich mitnichten immer um die gleichen Kontextmen&uuml;s. <\/p>\n<p>Wir haben folgenden Trick verwendet: <\/p>\n<ul>\n<li class=\"aufz-hlung\">&Ouml;ffnen Sie Word und ein Dokument, das alle betroffenen Bereiche (normaler Text, Tabelle, Textfeld, &#8230;) enth&auml;lt.<\/li>\n<li class=\"aufz-hlung\">Wechseln Sie mit der Tastenkombination <b>Alt + F11 <\/b>zum VBA-Editor.<\/li>\n<li class=\"aufz-hlung\">Legen Sie ein Standardmodul an und tragen Sie die nachfolgend beschriebene Prozedur ein.<\/li>\n<li class=\"aufz-hlung\">Starten Sie die Prozedur.<\/li>\n<\/ul>\n<p>Die Prozedur <b>KontextmenuenamenFinden <\/b>stellt zun&auml;chst das aktuelle Dokument als Ziel f&uuml;r &auml;nderungen etwa der Men&uuml;leisten ein. Hintergrund: Unter Word funktioniert der Parameter <b>Temporary <\/b>der <b>Add<\/b>-Methode des <b>Commandbar<\/b>-Objekts nicht, der etwa unter Access daf&uuml;r sorgt, dass von einer Anwendung angelegte Kontextmen&uuml;s nach dem Schlie&szlig;en wieder verschwinden.<\/p>\n<p>Unter Word werden &auml;nderungen an den Men&uuml;s immer mit einem Dokument gespeichert, und das soll in diesem Fall das aktive Dokument sein. Anschlie&szlig;end durchl&auml;uft die Prozedur alle Kontextmen&uuml;s und f&uuml;gt einen Eintrag hinzu, der den Ausdruck <b>*NAME: <\/b>und den Namen des Kontextmen&uuml;s enth&auml;lt:<\/p>\n<pre>Public Sub KontextmenuenamenFinden()\r\n  Dim cbr As CommandBar\r\n  Dim cbc As CommandBarControl\r\n  Application.CustomizationContext = ThisDocument\r\n  For Each cbr In CommandBars\r\n     If cbr.Type = msoBarTypePopup Then\r\n      On Error Resume Next\r\n      Set cbc = cbr.Controls.Add(1)\r\n      cbc.Caption = &quot;*NAME: &quot; &amp; cbr.Name\r\n      On Error GoTo 0\r\n    End If\r\n  Next cbr\r\nEnd Sub<\/pre>\n<p>Wenn Sie nun zum Word-Dokument wechseln und beispielsweise in einem normalen Absatz das Kontextmen&uuml; bet&auml;tigen, finden Sie ganz unten einen Eintrag <b>*NAME: Text <\/b>vor, was uns den Namen dieses Kontextmen&uuml;s liefert (siehe Bild 12).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_02\/Serienbrief-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Ermitteln des Namens eines Kontextmen&uuml;s unter Word<\/span><\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Kontextmen&uuml;-Klassen<\/p>\n<p>Wir ben&ouml;tigen eine ganze Menge Kontextmen&uuml;-Erweiterungen, die fast alle die gleiche Funktion ausl&ouml;sen sollen &#8211; n&auml;mlich eine, die einen Platzhalter in das Word-Dokument einf&uuml;gt.<\/p>\n<p>Normalerweise schreibt man den Namen einer solchen Funktion einfach in die <b>OnAction<\/b>-Eigenschaft, und die Funktion selbst landet in einem Standardmodul. Leider findet eine auf diese Weise in einer fremden Anwendung wie Word eingebaute Kontextmen&uuml;-Schaltfl&auml;che die in der Access-Anwendung untergebrachte Funktion nicht, sodass wir hier zu etwas aufwendigeren Mitteln greifen m&uuml;ssen. Um den Rahmen dieses Beitrags nicht zu sprengen, haben wir diese Technik in einem weiteren Beitrag namens <b>Trojanische Kontextmen&uuml;s<\/b> (<b>www.access-im-unternehmen.de\/713<\/b>) untergebracht.<\/p>\n<p>In unserem Falle sind lediglich noch zwei Ereignisse interessant, die durch die Klassen zum Einbau der Schaltfl&auml;chen in die Word-Kontextmen&uuml;s ausgel&ouml;st werden und wie folgt aussehen:<\/p>\n<pre>Private Sub objCommandbarText_VorlageErstellt(strVorlage As String)\r\n  On Error Resume Next\r\n  Me!txtDokument = strVorlage\r\n  Set objDocument = Nothing\r\n  objWord.Quit\r\n  Set objWord = Nothing\r\nEnd Sub<\/pre>\n<p>Diese Ereignisprozeduren (hier stellvertretend f&uuml;r das Kontextmen&uuml; <b>Text<\/b>) liefern als Parameter den Wert der Vorlagendatei, die soeben bearbeitet wurde. Au&szlig;erdem werden das bearbeitete Dokument und Word von Access aus kontrolliert geschlossen.<\/p>\n<p><b>&auml;nderungen des Namens der Ausgangsdatei &uuml;berwachen<\/b><\/p>\n<p>Damit sp&auml;ter keine Fehler passieren, falls der Benutzer versehentlich den Pfad und Namen einer nicht vorhandenen Datei eingibt oder das Textfeld <b>Ausgangsdokument <\/b>gar komplett leer l&auml;sst, pr&uuml;fen wir dies mit zwei Ereignisprozeduren, die nach Aktualisierung des Feldinhalts und nach jeder einzelnen &auml;nderung ausgel&ouml;st werden. Beide so ausgel&ouml;sten Ereignisprozeduren rufen die Prozedur <b>SeriendruckAktualisieren <\/b>auf:<\/p>\n<pre>Private Sub txtDokument_AfterUpdate()\r\n  Call SeriendruckAktualisieren\r\nEnd Sub\r\nPrivate Sub txtDokument_Change()\r\n  Call SeriendruckAktualisieren\r\nEnd Sub<\/pre>\n<p>Diese pr&uuml;ft schlie&szlig;lich mit der <b>Dir<\/b>-Funktion, ob der aktuelle Inhalt des Textfeldes zu einer vorhandenen Datei f&uuml;hrt.<\/p>\n<p>Abh&auml;ngig vom Ergebnis wird die Schaltfl&auml;che <b>cmdSerienbriefErstellen <\/b>aktiviert oder deaktiviert, sodass kein Seriendruck gestartet werden kann, wenn keine g&uuml;ltige Ausgangsdatei vorliegt:<\/p>\n<pre>Private Sub SeriendruckAktualisieren()\r\n  Dim strAusgangsdokument As String\r\n  Dim bolAusgangsdokumentVorhanden As Boolean\r\n  On Error Resume Next\r\n  strAusgangsdokument = _\r\n  Dir(Me!txtDokument.Text)\r\n  On Error GoTo 0\r\n  If Len(strAusgangsdokument) = 0 Then\r\n    bolAusgangsdokumentVorhanden = False\r\n  Else\r\n    bolAusgangsdokumentVorhanden = True\r\n  End If\r\n  Me!cmdSerienbriefErstellen.Enabled = _\r\n  bolAusgangsdokumentVorhanden\r\nEnd Sub<\/pre>\n<p><b>Zieldokument ausw&auml;hlen<\/b><\/p>\n<p>Die Schaltfl&auml;che hinter dem Textfeld <b>Zieldatei <\/b>ruft die folgende Ereignisprozedur auf, mit welcher der Benutzer das Verzeichnis und den Namen der zu speichernden Datei ausw&auml;hlen kann.<\/p>\n<p>Als Dateiendung wird dabei die Dateiendung der als Ausgangsdokument verwendeten Datei eingesetzt:<\/p>\n<pre>Private Sub cmdSaveAs_Click()\r\n  Dim strExtension As String\r\n  strExtension = Mid(Me!txtDokument, _\r\n  InStrRev(Me!txtDokument, &quot;.&quot;) + 1)\r\n  Me!txtSerienbrief = _\r\n  GetSaveFile(CurrentProject.Path, , _\r\n  &quot;Word-Dokument (*.&quot; &amp; strExtension _\r\n  &amp; &quot;)&quot;, &quot;Speichern unter&quot;)\r\nEnd Sub<\/pre>\n<p><b>Seriendruck starten<\/b><\/p>\n<p>Schlie&szlig;lich k&ouml;nnen wir uns endlich dem Seriendruck selbst widmen. Den kompletten Ablauf zeigt Listing 6.<\/p>\n<p class=\"kastentabelleheader\">Listing 6: Durchf&uuml;hren des Seriendrucks<\/p>\n<pre>Private Sub cmdSerienbriefErstellen_Click()\r\n  ''...Variablendeklaration\r\n  Set objWord = CreateObject(&quot;Word.Application&quot;)\r\n  Set objDocument = objWord.Documents.Open(Chr(34) &amp; Me!txtDokument &amp; Chr(34))\r\n  objDocument.Application.Visible = True\r\n  Set objMerge = objDocument.MailMerge\r\n  strDatabase = dbc.Name\r\n  strConnection = &quot;DSN=Microsoft Access-Datenbank;DBQ=&quot; &amp; strDatabase &amp; &quot;;DriverId=25;\r\n  FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;&quot;\r\n  objMerge.MainDocumentType = wdFormLetters\r\n  objMerge.OpenDataSource Name:=dbc.Name, LinkToSource:=True, Connection:=strConnection, _\r\n    SQLStatement:=&quot;SELECT * FROM [tblSerienbrief_Temp] WHERE [Serienbrief] = True&quot;, _\r\n    SubType:=wdMergeSubTypeAccess\r\n  Set tdf = dbc.TableDefs(&quot;tblSerienbrief_Temp&quot;)\r\n  For Each fld In tdf.Fields\r\n    Set objRange = objDocument.Range\r\n    Set objRangeFound = objDocument.Range(0, 0)\r\n    strPlatzhalter = &quot;[&quot; &amp; fld.Name &amp; &quot;]&quot;\r\n    With objRange.Find\r\n      .Text = strPlatzhalter\r\n      .Execute\r\n      Do While .Found = True\r\n        objRangeFound.SetRange objRange.Start, objRange.End\r\n        objRange.SetRange objRange.End, objDocument.Range.End\r\n        Set objMailMergeField = objMerge.Fields.Add(objRangeFound, fld.Name)\r\n        .Text = strPlatzhalter\r\n        .Execute\r\n      Loop\r\n    End With\r\n  Next fld\r\n  objMerge.ViewMailMergeFieldCodes = True\r\n  objMerge.Destination = wdSendToNewDocument\r\n  objMerge.Execute\r\n  Set objMailMergeDocument = objWord.Documents(1)\r\n  If Len(Nz(Me!txtSerienbrief)) = 0 Then\r\n    objMailMergeDocument.Application.Visible = True\r\n  Else\r\n    objMailMergeDocument.SaveAs Chr(34) &amp; Me!txtSerienbrief &amp; Chr(34)\r\n    objMailMergeDocument.Close\r\n    Set objMailMergeDocument = Nothing\r\n  End If\r\n  objDocument.Close False\r\n  Set objDocument = Nothing\r\n  objWord.Quit\r\n  Set objWord = Nothing\r\nEnd Sub<\/pre>\n<p>Die Routine erstellt zun&auml;chst eine neue Word-Instanz, &ouml;ffnet das im Textfeld <b>txtDokument <\/b>angegebene Ausgangsdokument und macht Word sichtbar, damit der Anwender sieht, was geschieht. Dann erstellt sie ein neues <b>MailMerge<\/b>-Objekt.<\/p>\n<p>Dieses k&uuml;mmert sich um alle Belange rund um den Seriendruck. Damit dies reibungslos verl&auml;uft, stellen wir seine Eigenschaft <b>MainDocumentType <\/b>auf <b>wdFormLetters <\/b>ein und &ouml;ffnen die Datenquelle f&uuml;r den Seriendruck mit der Methode <b>OpenDataSource<\/b>.<\/p>\n<p>Diese Methode erwartet eine Reihe Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Name<\/b>: Name der Datenquelle, hier der Access-Datei<\/li>\n<li class=\"aufz-hlung\"><b>LinkToSource<\/b>: Gibt an, ob eine Verkn&uuml;pfung erstellt werden soll<\/li>\n<li class=\"aufz-hlung\"><b>Connection<\/b>: Zuvor zusammengestellte Verbindungszeichenfolge mit spezifischen Eigenschaften der Quelle<\/li>\n<li class=\"aufz-hlung\"><b>SQLStatement<\/b>: Abfrageausdruck, der die Quelldaten liefert. Wichtig: Feld- und Tabellennamen vorsichtshalber immer in eckige Klammern setzen.<\/li>\n<li class=\"aufz-hlung\"><b>SubType<\/b>: Art des Seriendrucks, hier <b>wdMergeSubTypeAccess<\/b><\/li>\n<\/ul>\n<p>Dann folgt der f&uuml;r einen Seriendruck untypische Vorgang: Unser Seriendruckdokument verf&uuml;gt ja noch &uuml;ber keine der typischen Seriendruckfelder, sondern nur &uuml;ber Platzhalter der Form <b>[&lt;Feldname&gt;]<\/b>. Die folgende <b>For Each<\/b>-Schleife durchl&auml;uft alle Felder der Datenherkunft.<\/p>\n<p>Dabei sucht sie jeweils nach dem Platzhalter f&uuml;r das aktuelle Feld und ersetzt diesen durch ein entsprechendes Seriendruckfeld, das den Namen des Quellfeldes erh&auml;lt. Die <b>Do While<\/b>-Schleife f&uuml;r die Suche nach dem jeweiligen Platzhaltertext stellt sicher, dass auch mehrere Vorkommen des gleichen Platzhalters durch Seriendruckfelder ersetzt werden.<\/p>\n<p>Nach diesem Vorgang sorgt das Einstellen der Eigenschaft <b>ViewMailMergeFieldCodes <\/b>auf den Wert <b>True <\/b>daf&uuml;r, dass die Seriendruckfelder sichtbar werden. Der Wert <b>wdSendToNewDocument <\/b>f&uuml;r die Eigenschaft <b>Destination <\/b>des <b>MailMerge<\/b>-Objekts sorgt daf&uuml;r, dass der Seriendruck in einem neuen Dokument landet.<\/p>\n<p>Die Execute-Anweisung f&uuml;hrt schlie&szlig;lich die Datens&auml;tze der Datenquelle und das Ausgangsdokument zu einem neuen Dokument zusammen. Wenn der Benutzer zuvor einen Dateinamen angegeben hat, unter dem das Seriendruckdokument gespeichert werden soll, wird das Dokument direkt gespeichert und geschlossen, anderenfalls wird dieses eingeblendet und der Benutzer erh&auml;lt die M&ouml;glichkeit, das Dokument selbst zu speichern.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Den <b>aiuSeriendruck<\/b>-Assistenten k&ouml;nnen Sie in allen Datenbankanwendungen global einsetzen. Es fehlt noch eine M&ouml;glichkeit, die Konfiguration f&uuml;r einen Seriendruck zu speichern, doch dies w&uuml;rde den Rahmen dieses Beitrags sprengen.<\/p>\n<p>Wenn Sie die L&ouml;sung nicht als Add-In, sondern als Teil einer anderen Anwendung einsetzen m&ouml;chten, dann brauchen Sie eigentlich nur alle Elemente in diese Anwendung zu kopieren und an geeigneter Stelle den Aufruf des Formulars <b>frmSerienbrief <\/b>zu integrieren.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>aiuSeriendruck.mda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{6915E1A4-66D1-4B5F-B71D-22765932E758}\/aiu_714.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eines der meistgefragten Themen im Office-Bereich ist immer wieder: Wie schaufle ich am einfachsten die Daten einer Access-Tabelle nach Word und f&uuml;lle damit einen Serienbrief Sie k&ouml;nnen dazu nat&uuml;rlich einfach eine Abfrage mit den relevanten Daten vorbereiten und den Rest von Word aus mit den entsprechenden Werkzeugen der Benutzeroberfl&auml;che erledigen. Wenn Sie dem Nutzer aber wirklich Arbeit ersparen m&ouml;chten, zwingen Sie ihn nicht, seine geliebte Access-Anwendung zu verlassen &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022010,662010,44000026,44000031],"tags":[],"class_list":["post-55000714","post","type-post","status-publish","format-standard","hentry","category-66022010","category-662010","category-Interaktiv","category-Word"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Ferngesteuerter Seriendruck mit Access und Word - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ferngesteuerter Seriendruck mit Access und Word\" \/>\n<meta property=\"og:description\" content=\"Eines der meistgefragten Themen im Office-Bereich ist immer wieder: Wie schaufle ich am einfachsten die Daten einer Access-Tabelle nach Word und f&uuml;lle damit einen Serienbrief Sie k&ouml;nnen dazu nat&uuml;rlich einfach eine Abfrage mit den relevanten Daten vorbereiten und den Rest von Word aus mit den entsprechenden Werkzeugen der Benutzeroberfl&auml;che erledigen. Wenn Sie dem Nutzer aber wirklich Arbeit ersparen m&ouml;chten, zwingen Sie ihn nicht, seine geliebte Access-Anwendung zu verlassen ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:12:11+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg03.met.vgwort.de\/na\/f46ba72fe8604b88be351885fb801c0d\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"30\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Ferngesteuerter Seriendruck mit Access und Word\",\"datePublished\":\"2020-05-22T22:12:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/\"},\"wordCount\":4802,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/f46ba72fe8604b88be351885fb801c0d\",\"articleSection\":[\"2\\\/2010\",\"2010\",\"Interaktiv\",\"Word\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/\",\"name\":\"Ferngesteuerter Seriendruck mit Access und Word - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/f46ba72fe8604b88be351885fb801c0d\",\"datePublished\":\"2020-05-22T22:12:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/f46ba72fe8604b88be351885fb801c0d\",\"contentUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/f46ba72fe8604b88be351885fb801c0d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ferngesteuerter Seriendruck mit Access und Word\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ferngesteuerter Seriendruck mit Access und Word - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/","og_locale":"de_DE","og_type":"article","og_title":"Ferngesteuerter Seriendruck mit Access und Word","og_description":"Eines der meistgefragten Themen im Office-Bereich ist immer wieder: Wie schaufle ich am einfachsten die Daten einer Access-Tabelle nach Word und f&uuml;lle damit einen Serienbrief Sie k&ouml;nnen dazu nat&uuml;rlich einfach eine Abfrage mit den relevanten Daten vorbereiten und den Rest von Word aus mit den entsprechenden Werkzeugen der Benutzeroberfl&auml;che erledigen. Wenn Sie dem Nutzer aber wirklich Arbeit ersparen m&ouml;chten, zwingen Sie ihn nicht, seine geliebte Access-Anwendung zu verlassen ...","og_url":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:12:11+00:00","og_image":[{"url":"http:\/\/vg03.met.vgwort.de\/na\/f46ba72fe8604b88be351885fb801c0d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"30\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Ferngesteuerter Seriendruck mit Access und Word","datePublished":"2020-05-22T22:12:11+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/"},"wordCount":4802,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/#primaryimage"},"thumbnailUrl":"http:\/\/vg03.met.vgwort.de\/na\/f46ba72fe8604b88be351885fb801c0d","articleSection":["2\/2010","2010","Interaktiv","Word"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/","url":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/","name":"Ferngesteuerter Seriendruck mit Access und Word - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/#primaryimage"},"thumbnailUrl":"http:\/\/vg03.met.vgwort.de\/na\/f46ba72fe8604b88be351885fb801c0d","datePublished":"2020-05-22T22:12:11+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/#primaryimage","url":"http:\/\/vg03.met.vgwort.de\/na\/f46ba72fe8604b88be351885fb801c0d","contentUrl":"http:\/\/vg03.met.vgwort.de\/na\/f46ba72fe8604b88be351885fb801c0d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Ferngesteuerter_Seriendruck_mit_Access_und_Word\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Ferngesteuerter Seriendruck mit Access und Word"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000714","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000714"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000714\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000714"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}