Ferngesteuerter Seriendruck mit Access und Word

Eines der meistgefragten Themen im Office-Bereich ist immer wieder: Wie schaufle ich am einfachsten die Daten einer Access-Tabelle nach Word und fülle damit einen Serienbrief Sie können dazu natürlich einfach eine Abfrage mit den relevanten Daten vorbereiten und den Rest von Word aus mit den entsprechenden Werkzeugen der Benutzeroberfläche erledigen. Wenn Sie dem Nutzer aber wirklich Arbeit ersparen möchten, zwingen Sie ihn nicht, seine geliebte Access-Anwendung zu verlassen …

In der Regel verläuft das Erstellen eines Dokuments für den Seriendruck so:

  • Der Benutzer erstellt eine Abfrage, die alle für den Seriendruck zu verwendenden Daten enthält. Dies ist der Teil, den er von Access aus erledigen kann, das Filtern ist auch später in Word noch möglich.
  • Danach startet er Word, erzeugt ein Seriendruckdokument und wählt die Datenherkunft für die Adressaten und weitere Informationen aus – in diesem Fall aus der bereits vorbereiteten Access-Abfrage.
  • Dann fügt der Benutzer die Seriendruckfelder in das Dokument ein, die auf den in der Datenherkunft definierten Feldern basieren.
  • Nachdem er gegebenenfalls noch die Empfängerliste bearbeitet hat, sorgt ein Klick auf die Schaltfläche Fertig stellen und zusammenführen für das Erstellen des fertigen Seriendruckdokuments.

Details wollen wir uns an dieser Stelle ersparen, Anleitungen für den üblichen Weg gibt es wie Sand am Meer.

Optimaler Seriendruck mit Access und Word

Wir haben uns gefragt, wie man dem Benutzer die Seriendruckerstellung eines Serienbriefs so einfach wie möglich machen kann. Tatsache ist, dass er um die folgenden drei Aufgaben nicht herumkommt:

  • Festlegen der einzufügenden Daten, sprich: Welche Datenfelder und welche Datensätze sollen den Serienbrief füllen
  • Erstellen eines Word-Dokuments, das irgendwie geartete Platzhalter für die einzufügenden Daten enthält.
  • Zuweisen der Inhalte der Datenherkunft zu den Platzhaltern im Dokument.

Der Seriendruck-Assistent

Der Seriendruck-Assistent dieses Beitrags kann auf zweierlei Arten eingesetzt werden: Erstens können Sie ihn natürlich in eigene Anwendungen einbauen, wenn diese eine Funktion zum Erstellen von Serienbriefen mitliefern soll. Zweitens können Sie ihn als Access-Add-In in Access integrieren, sodass dieser in jeder beliebigen Anwendung zur Verfügung steht. Sie können dann also beispielsweise Ihre Adressverwaltung öffnen, die bis dato gar keine Seriendruckfunktion enthielt, und auf Basis beliebiger Tabellen oder Abfragen Serienbriefdokumente füllen.

Add-In installieren

Schauen wir uns zunächst an, wie der Serienbrief-Assistent als Add-In funktioniert. Sie müssen dazu zunächst die Datei aiuSeriendruck.mda aus dem Download zu diesem Beitrag in ein beliebiges Verzeichnis kopieren. Dann starten Sie Access und öffnen eine Datenbank Ihrer Wahl. Unter Access 2007 finden Sie im Ribbon unter Datenbanktools|Datenbanktools|Add-Ins|Add-In-Manager das Werkzeug, um Add-Ins zu installieren. Im Dialog Add-In-Manager klicken Sie auf die Schaltfläche Hinzufügen… (siehe Bild 1) und wählen im folgenden Datei öffnen-Dialog die Datei aiuSeriendruck.mda aus.

pic002.png

Bild 1: Hinzufügen eines Access-Add-Ins

Anschließend finden Sie unter Access 2007 in der Ribbon-Liste Add-Ins einen neuen Eintrag namens aiuSeriendruck (siehe Bild 2).

pic003.png

Bild 2: Aufrufen des Seriendruck-Assistenten

Unter Access 2003 und älter finden Sie die Möglichkeit zum Installieren und Aufrufen des Assistenten übrigens unter dem Menüeintrag Extras|Add-Ins.

Vorbereitung

Bevor Sie den Seriendruck-Assistenten aufrufen, müssen Sie nur eine Voraussetzung schaffen: Sie benötigen eine Tabelle oder Abfrage, die alle zum Füllen des Seriendruck-Dokuments nötigen Daten enthält. Insbesondere gilt das für Tabellen, die Daten aus verknüpften Tabellen enthalten. Dies betrifft etwa den klassischen Fall der Anrede: Diese wird oft in einer Lookup-Tabelle namens tblAnreden gespeichert, in der eigentlichen Adresstabelle befindet sich dann ein Nachschlagefeld zur Auswahl der richtigen Anrede (siehe Bild 3). Die Tabelle tblAdressen allein ist hier nicht als Datenquelle für den Seriendruck zu gebrauchen, da das Feld AnredeID nur eine Zahl, aber keinen Ausdruck wie Herrn oder Frau enthält. Dem Seriendruck-Assistenten ist aber schon Genüge getan, wenn Sie die Daten der beiden Tabellen in einer einfachen Abfrage wie in Bild 4 zusammenfassen.

pic004.png

Bild 3: Typischer Fall einer Adressen- und einer Anreden-Tabelle

pic005.png

Bild 4: Diese Abfrage ist eine prima Datenquelle für einen Serienbrief.

Seriendruck durchführen

Nun kann es endlich losgehen: Starten Sie aiuSeriendruck und schauen Sie sich das einzige Formular des Assistenten an, das wie in Bild 5 aussieht.

pic001.png

Bild 5: Der Serienbrief-Assistent

Im ersten Schritt des Assistenten wählen Sie die Datenquelle für den Seriendruck aus. Der Assistent bietet alle Tabellen und Abfragen in einer Auswahlliste an – lediglich eventuell zur Ansicht freigegebene Systemtabellen, die mit MSys… beginnen, werden ausgeblendet (siehe Bild 6).

pic006.png

Bild 6: Auswahl der Datenquelle für den Serienbrief

Nach der Auswahl der Datenquelle geschieht etwas im Hintergrund: aiuSeriendruck speichert die Daten der Datenquelle in einer temporären Tabelle, ergänzt diese um ein Feld zur manuellen Auswahl der Datensätze und zeigt diese im Bereich Schritt 2 des Assistenten an (siehe Bild 7).

pic007.png

Bild 7: Auswahl der Datensätze, mit denen der Serienbrief gefüllt werden soll

Hier liefert aiuSeriendruck deutlich mehr Möglichkeiten als die Seriendruck-Funktion von Word. Sie können Folgendes erledigen:

  • Einzelne Einträge per Klick auf das jeweilige Kontrollkästchen aus- oder abwählen,
  • die angezeigten Einträge filtern, indem Sie die bekannten Filtermöglichkeiten der Datenblattansicht verwenden,
  • die jeweils angezeigten (und gegebenenfalls gefilterten) Datensätze mit einem Klick auf die Schaltfläche Auswahl markieren als ausgewählt markieren,
  • die jeweils angezeigten (und gegebenenfalls gefilterten) Datensätze mit einem Klick auf die Schaltfläche Ausgewählte abwählen als nicht ausgewählt markieren,
  • mit den Schaltflächen Alle auswählen oder Alle abwählen alle Datensätze als ausgewählt beziehungsweise nicht ausgewählt markieren.

Außerdem können Sie mit der Optionsgruppe Anzeigen festlegen, ob das Datenblatt alle Datensätze anzeigen soll oder nur die markierten oder nur die nicht markierten.

Word-Dokument vorbereiten

Nachdem der Benutzer die Daten für den Serienbrief mit den vorhandenen Hilfsmitteln vorbereitet hat, kann er sich dem Ausgangsdokument zuwenden. Hier gibt es zunächst drei Möglichkeiten, ein Dokument auszuwählen (siehe Bild 8). Diese drei sind über die folgenden Schaltflächen zu erreichen:

pic010.png

Bild 8: Auswahl einer Option zum Erstellen oder Öffnen eines Dokuments als Seriendruck-Vorlage

  • Ein bestehendes Dokument auswählen: Öffnet einen Datei öffnen-Dialog und erlaubt die Auswahl einer beliebigen Word-Datei.
  • Leeres Dokument erstellen: Diese Schaltfläche öffnet Word und erstellt ein neues, leeres Dokument auf Basis der Vorlage Normal.dot beziehungsweise Normal.dotx. Sie können gleich an Ort und Stelle beginnen, die gewünschten Platzhalter für den Seriendruck einzufügen. Wie das geht, besprechen wir weiter unten.
  • Dokument auf Basis einer Vorlage erstellen: Natürlich können Sie auch eine Dokumentvorlage als Ausgangspunkt für den Seriendruck verwenden. Auch dieses wählen Sie zunächst mit einem entsprechenden Dialog aus, und auch hier fügen Sie gleich die Platzhalter für den Seriendruck ein (Sie können dies aber auch später noch erledigen).

Nachdem Sie auf eine der drei Arten das gewünschte Dokument ausgewählt haben, sehen Sie dieses entweder schon vor sich (bei Betätigung der zweiten oder dritten Schaltfläche) oder Sie können das Dokument, dessen Dateiname nun im Textfeld Ausgangsdokument angezeigt wird, mit einem Klick auf die Schaltfläche Bearbeiten in Word öffnen.

Platzhalter einfügen

Für das nun geöffnete Word-Dokument gibt es eine ganz wichtige Regel: Sie müssen es mit dem Kontextmenüeintrag Alle Platzhalter gesetzt wieder schließen.

Davon abgesehen brauchen Sie eigentlich nur die Einfügemarke an der Stelle zu positionieren, an der Sie einen Platzhalter einfügen möchten, mit der rechten Maustaste das Kontextmenü aufzurufen und den einzufügenden Platzhalter auszuwählen (siehe Bild 9).

pic009.png

Bild 9: Einfügen von Platzhaltern per Kontextmenü

Dort finden Sie nach getaner Arbeit auch den Eintrag Alle Platzhalter gesetzt, mit dem die Arbeiten am Dokument beendet werden müssen.

Seriendruck starten

Nach getaner Arbeit brauchen Sie, wenn Sie möchten, nur noch ein Zieldokument für den Seriendruck auszuwählen. Dies erledigen Sie mit der Schaltfläche mit den drei Punkten (…). Der Name der per Datei speichern-Dialog ermittelten Datei wird anschließend in das Textfeld Zieldatei eingetragen. Mit einem Klick auf die Schaltfläche Seriendruck starten stoßen Sie den Seriendruck schließlich an. Sollten Sie nicht vorab einen Speichernamen für die zu erstellende Datei angegeben haben, bleibt das erstellte Dokument einfach geöffnet, sodass Sie selbst das Speichern übernehmen können (siehe Bild 10).

pic011.png

Bild 10: Anstoßen des Seriendrucks

Als Ergebnis erhalten Sie je nach der Anzahl der ausgewählten Datensätze ein Dokument mit der entsprechenden Anzahl Seiten – fertig!

Technische Hintergründe

Die Beispielanwendung enthä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ötigen, wird temporär angelegt und mit der Auswahl einer neuen Datenquelle wieder gelöscht.

Nur für die Installation des Add-Ins ist die Tabelle USysRegInfo 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üeintrags unter Add-Ins aufgerufen wird, die zweite Zeile den Namen der Add-In-Datei und die dritte den Text, der im Add-In-Manager angezeigt wird.

pic012.png

Bild 11: Diese Informationen werden zur Installation des Add-Ins benötigt.

Die Funktion Autostart() öffnet schlicht und einfach das Hauptformular des Add-Ins:

Public Function Autostart()
  DoCmd.OpenForm "frmSerienbrief", WindowMode:=acDialog
End Function

Quelltabelle auswählen

Beim Öffnen des Formulars frmSerienbrief löst das Ereignis Beim Öffnen die folgende Ereignisprozedur aus. Diese weist der Datensatzherkunft des Kombinationsfeldes cboSourceObject eine Abfrage zu, die alle als Datenquelle für den Seriendruck infrage kommenden Tabellen und Abfragen aus der Systemtabelle MSysObjects ausliest. Die zweite Anweisung dieser Prozedur ruft die Routine SteuerelementAktualisieren auf, die den Inhalt einiger Steuerelemente prüft und in Abhängigkeit davon andere Steuerelemente aktiviert oder deaktiviert (s. Listing 1).

Listing 1: Füllen der Datenquellen-Liste beim Öffnen des Formulars

Private Sub Form_Open(Cancel As Integer)
  Me!cboSourceObject.RowSource = "SELECT Name FROM MSysObjects IN ''" & dbs.Name _
  & "'' WHERE (Type=1 Or Type=5) AND Name NOT LIKE ''MSys*'' AND Name NOT LIKE ''~*'' "
  SteuerelementeAktualisieren
End Sub

Daten der Quelltabelle anzeigen

Wenn der Benutzer die Quelle für den Seriendruck ausgewählt hat, beginnt die Anwendung mit einer Menge Arbeit. Den Startschuss markiert das Auslösen der Ereignisprozedur cblSourceObject_AfterUpdate (s. Listing 2). Diese leert als Erstes das Unterformularsteuerelement sfmAdressen, das später die Daten anzeigen soll (nur für den Fall, dass zuvor schon eine andere Quelle ausgewählt wurde).

Listing 2: Anzeige der Daten der Quelltabelle

Private Sub cboSourceObject_AfterUpdate()
  Me!sfmAdressen.SourceObject = ""
  If Not Len(Me!cboSourceObject) = 0 Then
    TempTabelleErstellen (Me!cboSourceObject)
    With Me!sfmAdressen
      .SourceObject = "Table.tblSerienbrief_Temp"
      .Form.Controls("Serienbrief").ColumnOrder = 0
      .Form.DatasheetFontHeight = 9
    End With
  End If
  Call SteuerelementeAktualisieren
End Sub

Nach einer Prüfung, ob tatsächlich ein Eintrag ausgewählt wurde, ruft die Prozedur eine weitere Prozedur namens TempTabelleErstellen auf (s. Listing 3) und übergibt als einzigen Parameter den Namen der Quelltabelle oder -abfrage. Nachdem diese ihren Dienst verrichtet hat (mehr dazu weiter unten), liegt eine temporäre Tabelle namens tblSerienbrief_Temp vor.

Listing 3: Anzeige der Daten der Quelltabelle

Public Sub TempTabelleErstellen(strSource As String)
  Dim tdf As DAO.TableDef
  Dim fld As DAO.Field
  Dim prp As DAO.Property
  On Error Resume Next
  dbc.Execute "DROP TABLE tblSerienbrief_Temp", dbFailOnError
  On Error GoTo 0
  dbc.Execute "SELECT * INTO tblSerienbrief_Temp FROM " & strSource & " IN ''" & dbs.Name _
  & "''", dbFailOnError
  dbc.Execute "ALTER TABLE tblSerienbrief_Temp ADD Serienbrief BIT", dbFailOnError
  dbc.Execute "UPDATE tblSerienbrief_Temp SET Serienbrief = TRUE", dbFailOnError
  Set tdf = dbc.TableDefs("tblSerienbrief_Temp")
  Set fld = tdf.Fields("Serienbrief")
  Set prp = fld.CreateProperty("DisplayControl", DB_INTEGER, 106, True)
  On Error Resume Next
  fld.Properties.Delete "DisplayControl"
  On Error GoTo 0
  fld.Properties.Append prp
End Sub

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar