Seriendruck mit Access und Word, Teil II

Unser Beitrag zum Thema Ferngesteuerter Seriendruck mit Access und Word hat soviel Feedback geliefert, dass wir Ihnen einige Verbesserungen und Erweiterungen liefern möchten. Der vorliegende Beitrag zeigt, welche Schwachstellen das Add-In noch enthielt und wie Sie diese beheben.

Fehler 5922 – Word konnte die Datenquelle nicht öffnen

Dieser Fehler trat speziell unter Access 2010 auf, und zwar in der folgende Zeile der Prozedur cmdSerienbriefErstellen_Click:

objMerge.OpenDataSource Name:=dbc.Name, 
LinkToSource:=True, 
Connection:=strConnection, 
SQLStatement:="SELECT * FROM [tblSerienbrief_Temp] 
WHERE [Serienbrief] = True", 
SubType:=1

Die Lösung war nicht einfach zu finden. Ein Tipp von Sascha Trowitzsch führte schließlich dazu, einmal den Makro-Editor unter Word zu starten und manuell einen Seriendruck auf Basis der betroffenen Tabelle der Add-In-Datenbank zu erstellen.

Fazit: Word kommt anscheinend nicht mit dem Datentyp .mda klar! Wenn Sie dort eine bestehende Datenquelle auswählen, müssen Sie Alle Dateien (*.*) als Filter festlegen, um überhaupt auf die .mda-Datei zugreifen zu können. Im nächsten Schritt zeigt sich dann, dass Word sich unter diesem Dateityp nichts vorstellen kann und beim Analysieren des Inhalts scheitert (s. Abb. 1).

pic001.png

Abb. 1: Versuch, Daten aus einer .mda-Datei als Quelle für einen Seriendruck zu verwenden

Ein kleiner Versuch brachte schließlich die Lösung dieses Problems: Der Dateiname wurde von .mda zurück in .mdb geändert und siehe da – Word liest die Daten problemlos ein. Die oben genannte und für den Fehler verantwortliche Zeile mit dem Aufruf der OpenDataSource-Methode funktioniert nun einwandfrei.

Allerdings lässt sich die .mdb-Datei nun nicht mehr direkt als Add-In installieren, da hier standardmäßig nur .mda– beziehungsweise .accdb-Dateien ausgewählt werden können. Das ist aber kein Problem, denn auch hier lässt sich der Filter auf alle Dateien einstellen.

Und zu guter Letzt müssen Sie noch die Tabelle USysRegInfo anpassen. Die Angabe der Library müssen Sie von aiuSeriendruck.mda auf aiuSeriendruck.mdb ändern, damit Access die umbenannte Datei weiterhin findet (s. Abb. 2).

pic002.png

Abb. 2: Anpassung der Tabelle USysRegInfo, damit Access das Add-In ordnungsgemäß starten kann

Kontextmenüeinträge bei mehreren Seriendrucken

Gelegentlich möchte man nicht nur ein, sondern mehrere verschiedene Dokumente im Seriendruck verarbeiten. Zum Hinzufügen der Platzhalter in Word hat aiuSeriendruck ja das Kontextmenü des Dokuments so angepasst, dass Sie alle Felder der Quelltabelle über die Auswahl eines Eintrags wie etwa [Vorname] einfügen können.

Leider behält das Kontextmenü diese Einträge bei, sodass das Kontextmenü mit jedem neuen Dokument länger wird. Die Lösung dieses Problems war ebenfalls nicht einfach zu finden. Eigentlich konnte man davon ausgehen, dass es reicht, beim Erstellen der Kontextmenüeinträge mit der Add-Methode den Temporary-Parameter auf True einzustellen. Dies würde bedeuten, dass die angelegten Einträge beim Schließen von Word wieder gelöscht würden:

Set cbc = m_Commandbar.Controls.Add(1, , , , True)

Aber dies reichte aus unerfindlichen Gründen nicht. Also griff ich zu weiteren Maßnahmen: Alle neu angelegten Kontextmenüeinträge wurden mit einem Wert für die Tag-Eigenschaft versehen, der das Tilde-Zeichen und die Beschriftung des Kontextmenüeintrags enthielt, also beispielsweise ~[Vorname]. Dies alles mit dem Zweck, eventuell verbleibende Einträge vor dem erneuten Anlegen des Kontextmenüs mit der Delete-Methode in einer Schleife über alle Einträge er jeweiligen Kontextmenüeinträge wieder zu löschen. Auch das brachte nicht die geringste änderung!

Die Lösung fand sich schließlich in Word selbst: Wenn Sie bei geöffnetem Word-Dokument Elemente zur CommandBars-Auflistung hinzufügen und das Dokument dann speichern, werden diese Elemente mit dem Dokument gespeichert.

Das Speichern des Dokuments tritt in aiuSeriendruck auf, wenn der Benutzer den letzten Kontextmenüeintrag mit der Beschriftung Alle Platzhalter gesetzt anklickt. Dies löst eine entsprechende Ereignisprozedur aus, die um zwei Anweisungen ergänzt werden muss – und zwar um den Aufruf der Methode Reset für die beiden um temporäre Einträge erweiterten Kontextmenüs. Reset setzt die Kontextmenüs wieder so zurück, dass diese nur noch eingebaute Elemente enthalten (s. Listing 1).

Listing 1: Speichern des um Platzhalter ergänzten Dokuments und vorheriges Zurücksetzen der Kontextmenüs

Private Sub m_cbc_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    Select Case Ctrl.Caption
    Case "Alle Platzhalter gesetzt"
    On Error Resume Next
    m_Document.CommandBars("Text").Reset
    m_Document.CommandBars("Table Text").Reset
    m_Document.Save
    If Err.Number = 0 Then
        strVorlage = m_Document.Path & "\\" & m_Document.Name
        RaiseEvent VorlageErstellt(strVorlage)
    Else
        RaiseEvent VorlageErstellt("")
    End If
    Case Else
    m_Document.Application.Selection.Text = m_Text
    End Select
    End Sub

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

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar