' Nachfolgend wird Word aus Access heraus gesteuert. Access übergibt in Formularfeldern gespeicherte Daten an Word.
' Die Kommunikation mit Word erfordert unter Extras/Verweise den Eintrag »Microsoft Word 16.0 Object Library«
' Der erläuterte Code wird in ein Access-Modul geschrieben. Modul = »modKommunikationMitWord«.
' Das Word-Template und die Source bestehen aus den Komponenten a) - f)
' Komponente a): ein Word-Template, gespeichert im Format dotm, abgelegt im Ordner BausteinObjekte.
' Der Ordner BausteinObjekte befindet sich im gleichen Verzeichnis, wie die Access-db.
' Im Ordner BausteinObjekte befindet sich das Templates lautet: TemplateFuermodKommunikationMitWord.dotm
' Das Template enthält die Textmarken »bmkNameHinterbliebene« und »bmkAnschriftHinterbliebene«.
' Komponente b) Definiere Variablen im Header von »modKommunikationMitWord«.
Option Compare Database
Option Explicit
' Variable zur WordKommunikation global definieren
Dim objWord As Word.Application
Dim objDoc As Word.Document
Dim objSel As Word.Selection
' Formularvariable zur Kommunikation aus dem Access-Formular >frmPersonendaten< nach Word global definieren
Dim FormAdressdaten As Form
' Komponente c) Eine Funktion, welche zuerst Word und folgend das mit Variablen zu füllende Template startet
Function StarteWordUndZentralesTemplate()
' Aufgabe dieser Function: Word wird gestartet und das zentrale Template wird gezeigt.
' Der Versuch, eine Referenz auf eine bereits laufende Instanz von Word zu setzen, kann zur Exception
' infolge Error 91 führen. Daher wird zum Start von Word auf einen ErrorHandler verzichtet.
On Error Resume Next
' Das Template liegt im Ordner >>HiBiBausteinObjekte<<
Dim strBausteinpfad As String
strBausteinpfad = Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Dir(CurrentDb.Name))) & "BausteinObjekte\"
' Versuch, eine Referenz auf eine bereits laufende Instanz von Word zu setzen
Set objWord = GetObject(, "Word.Application")
' Wenn keine Referenz ermittelt wird, dann eine neue Word-Instanz starten
If Err <> 0 Then
Err = 0
Set objWord = CreateObject("Word.Application") ' neue Word-Instanz starten
Else
' Wurde eine Referenz ermittelt, wird deren Eigenschaft geprüft
' Wenn Word unsichtbar läuft, dann läuft es entweder als E-Mail-Editor von
' Outlook oder es wird von anderer Seite per Office-Automation benutzt
If Not objWord.Visible Then
Err = 0 ' Error-Wert wieder auf Null setzen
' neue Word-Instanz starten, damit die laufende Instanz nicht gestört wird
Set objWord = CreateObject("Word.Application")
End If
End If
' Word sichtbar machen, aktivieren und in den Vollbildmodus führen
With objWord
.Visible = True
.Activate
.WindowState = wdWindowStateMaximize
End With
' Word ist gestartet. Ab hier unterstützt ein Fehlerbehandler.
On Error GoTo ErrorHandler
' Starte jetzt das Template.
Set objDoc = _
objWord.Documents.Add(strBausteinpfad & "TemplateFuermodKommunikationMitWord.dotm")
Exit_StarteWordUndZentralesTemplate:
Exit Function
ErrorHandler:
Select Case Err.Number
Case 5174
' »modMessages« enthält Source zwecks Bearbeitens von Error-Numbers und wird hier nicht erklärt
modMessages.MessageExclamation ("Im Datenbankverzeichnis fehlt der Ordner >BausteinObjekte<" & vbCrLf & _
"oder in diesem Ordner fehlt die Dokumentvorlage für den VA."): End
Case Else
MsgBox Err.Number & ", " & Err.Description
End Select
Call modKommunikationMitWord.EntwerteWordObjektVariable
GoTo Exit_StarteWordUndZentralesTemplate
End Function
' Teste die Komponenten a - c. Starte dazu die die Function StarteWordUndZentralesTemplate().
' Folgendes Ergebnis wird erwartet: Word wird gestartet, das oben bezeichnete Template wird gestartet und mit der
' Bezeichnung »Dokument1« displayed
' Test okay? Dann weiter mit ...
' Komponenten zu d)
' Erstelle in der Access-db eine Tabelle, Name: »tbl_Personendaten«
' Feldnamen sind: NameHinterbliebene und AnschriftHinterbliebene
' Erfasse einige Testdatensätze
' Erstelle in der Access-db ein Formular, Name: »frmPersonendaten«
' Weise dem Formular die Datensatzquelle tbl_Personendaten zu.
' Definiere im Formular ein Textfeld NameHinterbliebene und ein Textfeld AnschriftHinterbliebene.
' Weise die Textfelder den dazugehörenden db-Feldern zu. Prüfe, ob dein Formular deine Testdatensätze zeigt.
' Definiere auf der Formularoberfläche zwei Befehlsschaltflächen:
' Beschrifte Befehlsschaltfläche #1 mit: StarteWordUndZentralesTemplate
' Weise dem Klickereignis folgenden Befehl zu: Call modKommunikationMitWord.StarteWordUndZentralesTemplate
' Beschrifte Befehlsschaltfläche #2 mit: Formulardaten_an_Word_Click
' Weise dem Klickereignis folgenden Befehl zu: Call modKommunikationMitWord.Formulardaten_an_Word_Click
' Komponente e) »modKommunikationMitWord« erhält eine Sub, welche nach Klick auf eine Formularschaltfläche
' Daten aus Textfeldern des Access-Formulars an das gestartete Template übergibt
Sub Formulardaten_an_Word_Click()
' Zuweisung des aufrufenden Formularobjektes zu einer Formularvariablen
' Dies erspart im weiteren unübersichtlichen Code.
' Mit Screen.ActiveForm wird das diese Source startende Access-Formular zugewiesen.
Set FormAdressdaten = Screen.ActiveForm
' Der Name des aktuell auf dem Monitor befindlichen Dokus muss abgelegt werden, damit beim Einfügen
' von Variablen stets das >richtige< Doku bedient wird
Dim AktuellesDokument, strDokumentvorlage As String
' Variable für die Bausteinverarbeitung
Dim strWordObjektTraeger, strDokPfad, strBausteinpfad As String
' Ablage der Ermittlungsformulare im genannten Verzeichnis
strDokPfad = Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Dir(CurrentDb.Name))) & "BausteinObjekte\"
' Ablage des Templates im genannten Verzeichnis
strDokumentvorlage = "TemplateFuermodKommunikationMitWord.dotm"
' Der im Header definierten Objektvariablen von Word werden das Template und die Variablen zugewiesen
With objWord
' das Template starten: verwende den vollst. Pfad und den Namen des Templates
.Documents.Add Template:=Chr(34) & strDokPfad & strDokumentvorlage & Chr(34)
' Zuweisen des aktiven Dokuments zur Variablen >AktuellesDokument<
AktuellesDokument = .ActiveDocument.Name
.Documents.Item(AktuellesDokument).Activate
With .Selection
If objWord.ActiveDocument.Bookmarks.Exists("bmkNameHinterbliebene") = True Then
.GoTo Name:="bmkNameHinterbliebene"
.TypeText Text:=FormAdressdaten!txtNameHinterbliebene
Else
Debug.Print ">bmkNameHinterbliebene< existiert nicht"
End If
If objWord.ActiveDocument.Bookmarks.Exists("bmkAnschriftHinterbliebene") = True Then
.GoTo Name:="bmkAnschriftHinterbliebene"
.TypeText Text:=FormAdressdaten!txtAnschriftHinterbliebene
Else
Debug.Print ">bmkAnschriftHinterbliebene< existiert nicht"
End If
End With
End With
End Sub
' Teste »frmPersonendaten«.
' Klick auf StarteWordUndZentralesTemplate: Word startet und zeigt das Template.
' Klick auf Formulardaten_an_Word_Click: Access übergibt die Variablen aus den Formularfeldern an das
' Template, dort an die durch Bookmarks gekennzeichneten Stellen.
' Komponente f)
Sub EntwerteWordObjektVariable()
Set objWord = Nothing
Set objDoc = Nothing
Set objSel = Nothing
End
End Sub
|