Ferngesteuerter Seriendruck mit Access und Word

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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

Unterformularen kann man auch eine Tabelle oder Abfrage als Herkunftsobjekt zuweisen, man muss dann allerdings je nach Typ den Ausdruck Table.<Tabellenname> beziehungsweise Query.<Tabellenname> voranstellen. In unserem Fall ist dies einfach: Wir wissen, dass wir mit einer Tabelle namens tblSerienbrief_Temp arbeiten, also lautet das neue Herkunftsobjekt Table.tblSerienbrief_Temp.

Anschließend geschehen noch zwei wichtige Schritte: Die per Code in der Prozedur TempTabelleErstellen erzeugte Tabelle besitzt unter anderem ein Ja/Nein-Feld, mit dem der Benutzer individuell auswählen soll, welche Datensätze beim Seriendruck berücksichtigt werden sollen. Dieses ist das letzte Feld der dynamisch erzeugten temporären Tabelle, soll aber als erste Spalte angezeigt werden, damit der Benutzer nicht unnötig scrollen muss. Dazu stellen wir die Eigenschaft ColumnIndex dieses Feldes auf den Wert 0 ein – alle anderen Felder rutschen so einen Platz weiter nach rechts. Außerdem zeigt Access die Daten in Datenblättern standardmäßig in Schriftgröße 11 an. Damit das Datenblatt zu den übrigen Steuerelementen passt, stellen wir diese mit der Eigenschaft DatasheetFontHeight auf Schriftgröße 9 ein (da wir mit einer Tabelle als Herkunftsobjekt des Unterformulars arbeiten, lässt sich dies nicht anderweitig festlegen). Schließlich ruft auch diese Prozedur die Routine SteuerelementeAktualisieren auf.

Temporäre Tabelle erstellen

Das Erstellen der temporären Tabelle erfolgt in der Prozedur TempTabelleErstellen, welche den Namen der ausgewählten Tabelle oder Abfrage als Parameter erwartet. Im ersten Schritt löscht diese Prozedur eine eventuell noch vorhandene Tabelle namens tblSerienbrief_Temp, da diese gleich neu erstellt wird. Dies erledigt eine einfache SELECT INTO-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 tblSerienbrief_Temp zugreifen müssen. Dazu haben wir zwei kleine Funktionen namens dbc und dbs im Modul mdlDatabase untergebracht, welche über die Eigenschaften CodeDB und CurrentDB den Verweis auf die jeweils benötigte Datenbank liefern und diesen für weitere Zugriffe zwischenspeichern:

Dim m_dbc As DAO.Database
Dim m_dbs As DAO.Database
Public Function dbc() As Database
  If m_dbc Is Nothing Then
    Set m_dbc = CodeDb
  End If
  Set dbc = m_dbc
End Function
Public Function dbs() As Database
  If m_dbs Is Nothing Then
    Set m_dbs = CurrentDb
  End If
  Set dbs = m_dbs
End Function

Diese beiden Funktionen kommen gleich in der Prozedur TempTabelleErstellen zum Einsatz. Die Tabelle wird zunächst über die Execute-Methode des von der Funktion dbc zurückgelieferten Verweises auf das Database-Objekt des Add-Ins gelöscht. Die erneute Erstellung dieser Tabelle über die SELECT INSERT-Abfrage verwendet gleich beide Database-Objekte: Das erste führt die Abfrage aus, das andere liefert den Namen der Datenbank, aus der die Daten stammen.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar