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