VBA: Aufruf Word, Werte aus Abfrage in Textmarken

Hallo zusammen,

ich habe gerade begonnen, mich mit VBA zu beschäftigen. Derzeit quält mich folgendes Problem:

In einer Access-Datenbank habe ich auf einem Formular einen Button. Bei Betätigung des Buttons soll eine Abfrage mit Kriterium durchgeführt werden, dann ein Word-Dokument aus einer Vorlage geöffnet und die Werte der Abfrage in Textmarken im Word-Dokument eingesetzt werden.

Folgenden Text habe ich bisher geschrieben, bei allem anderen bin ich gescheitert:

Private Sub Befehl11_Click()
Dim objWord As Object
Dim Strsql As String

Strsql = „SELECT Kunden.KundenNr, Kunden.KundenName, Kunden.KundenOrt,“ & _
„Objekte.GerätNr, Objekte.GerätModell“ & _
"FROM Kunden INNER JOIN Objekte ON Kunden.KundenNr = Objekte.GerätKundenNr " & _
„WHERE (((Kunden.KundenNr)=Me.KundenNr)“

Set objWord = CreateObject(„Word.Application“)
objWord.documents.Add („C:\Dokumente und Einstellungen\User\Eigene Dateien\Tools\VBA\test.dot“)
objWord.activedocument.bookmarks(„Name“).SELECT
objWord.selection.Text = [HIER SOLL DER WERT AUS DER ABFRAGE ÜBERGEBEN WERDEN]
objWord.Visible = True
objWord.Activate

End Sub

Hallo!

Wenn ich das richtig sehe, fehlt also lediglich noch die Übertragung der Abfragewerte in die vorgesehenen Textmarken.

Habe die Prozedur etwas angepaßt. In der Variable Textmarken werden die Namen der in der Wordvorlage verwendeten Textmarken mit Komma getrennt eingetragen. Um die notwendige Abfrage auszuführen wird ein Recordsetobject erstellt (vorher in Extras/Verweise die Microsoft DAO 3.6 Object Library einschalten und möglichst weit nach oben bringen).
Die Textmarken werden wie die Abfragefelder in einer Schleife durchlaufen und übertragen.
Voraussetzung für die Funktion ist dass die Reihenfolge der Textmarken mit der Reihenfolge der Abfragefelder übereinstimmt.

hier nun die Prozedur:

Private Sub Befehl11\_Click()
Dim objWord As Object
Dim Strsql As String
Dim zähler As Integer
Dim rst As Recordset
Dim Textmarken As Variant

Textmarken = Array("TM\_KundenNr", "TM\_KundenName", "TM\_KundenOrt", \_
"TM\_GerätNr","TM\_GerätModell")

Strsql = "SELECT Kunden.KundenNr, Kunden.KundenName, Kunden.KundenOrt," & \_
"Objekte.GerätNr, Objekte.GerätModell" & \_
"FROM Kunden INNER JOIN Objekte ON Kunden.KundenNr = Objekte.GerätKundenNr " & \_
"WHERE (((Kunden.KundenNr)=Me.KundenNr)"

Set rst = CurrentDb.OpenRecordset(Strsql)
Set objWord = CreateObject("Word.Application")
objWord.Documents.Add ("C:\test.dot")
For zähler = 0 To UBound(Textmarken)
 On Error GoTo beiFehler
 objWord.ActiveDocument.Bookmarks(Textmarken(zähler)).Select
 On Error GoTo 0
 objWord.Selection.Text = rst.Fields(zähler)
Next zähler
rst.Close
objWord.Visible = True
objWord.Activate
Exit Sub

beiFehler:
If Err.Number = 5941 Then
 MsgBox "Es muß eine Textmarke mit der Bezeichung " & Textmarken(zähler) & " vorliegen!"
Else
 On Error GoTo 0
 Resume 'Standardfehlermeldung ausgeben
End If
Exit Sub
End Sub

Hallo „tester“,

danke für die Hilfe! Dein Tipp mit der DAO war Gold wert, war nicht aktiviert…

Nun noch eine Frage: Ich möchte den Code so abändern, dass er zwar alle Felder der Abfrage übernimmt, allerdings auch dann funktioniert, wenn in der Word-Dokumentvorlage nicht sämtliche Felder - in der entsprechenden Reihenfolge - verwendet werden. Mein Code sieht wie folgt aus. Das Problem ist, dass er mir in der Schleife einen Felder auswirft und nicht, wie ich versucht habe, bei nicht vorhandensein des Feldes auf das nächste Feld in der Abfrage sprint.

Vielleicht kannst Du noch mal helfen? Gruß, Dirk

Private Sub Befehl10_Click()

Dim objWord As Object
Dim Strsql As String
Dim db As DAO.Database
Dim record As Recordset
Dim Feldname As String

Strsql = "Select * from qryKundenObjekte WHERE Kunden.KundenNr = " & Me.KundenNr

Set record = CurrentDb.OpenRecordset(Strsql)

If record.EOF Then Exit Sub ’ Test ob ueberhaupt ein Datensatz gefunden wurde

record.MoveFirst ’ erster gefundener Datensatz

Set objWord = CreateObject(„Word.Application“)
objWord.Documents.Add („C:\Dokumente und Einstellungen\User\Eigene Dateien\Tools\VBA\test.dot“)

For zähler = 1 To record.Fields.Count
Feldname = record.Fields(zähler).Name
On Error GoTo Weiter
objWord.ActiveDocument.Bookmarks(Feldname).select
objWord.selection.Text = record.Fields(zähler).Value
Weiter:
Next zähler

MsgBox „ok“

Set record = Nothing
Set db = Nothing
objWord.Visible = True
objWord.Activate
Exit Sub

End Sub

Hallo,
die Schleife ist fehlerhaft. Die Felder des Recordset werden nicht mit 1 bis [Anzahl der Datenfelder] angesprochen, sondern das erste Datenfeld besitzt den Index _ 0 _ und das letzte Datenfeld den Index [Anzahl der Datenfelder -1].

Die Schleife muß also lauten :

For zähler = 0 To record.Fields.Count - 1

Übrigens - „Dim db As DAO.Database“ und „Set db = Nothing“ kann man sich sparen, wenn man „currentdb“ benutzt.

„On Error GoTo Weiter“ würde ich vor die Schleife setzen, da dieser Befehl nur einmal aufgerufen werden muß.

Hallo Tom,

vielen Dank für die Tipps. Habe den Code nun noch wie folgt modifiziert, da er mir immer noch Fehler ausgegeben hat, wenn die Textmarken nicht alle bzw. nicht in entsprechender Reihenfolge vorhanden waren.

Danke, Dirk

Private Sub Befehl10_Click()

Dim objWord As Object
Dim Strsql As String
Dim record As Recordset
Dim Feldname As String

Strsql = "Select * from qryKundenObjekte WHERE Kunden.KundenNr = " & Me.KundenNr

Set record = CurrentDb.OpenRecordset(Strsql)

If record.EOF Then Exit Sub ’ Test ob ueberhaupt ein Datensatz gefunden wurde

record.MoveFirst ’ erster gefundener Datensatz

Set objWord = CreateObject(„Word.Application“)
objWord.Documents.Add („C:\Dokumente und Einstellungen\User\Eigene Dateien\Tools\VBA\test.dot“)

For zähler = 0 To record.Fields.Count - 1
Feldname = record.Fields(zähler).Name
If objWord.ActiveDocument.Bookmarks.Exists(Feldname) = True Then
objWord.ActiveDocument.Bookmarks(Feldname).select
objWord.selection.Text = record.Fields(zähler).Value
End If
Next zähler

Set record = Nothing
objWord.Visible = True
objWord.Activate
Exit Sub

End Sub