Hallo un ein gesundes neues Jahr an alle,
ich möchte verschiedene Wordvorlagen aus ACCESS füllen und Drucken.
Für eine Vorlage auch kein Problem erstmal.
Da die Ausgabe aber über eine Funktion läuft würde ich die zusammenstellung der Bookmarks gerne vorab gestalten und nicht in der Funktion selbst.
Function WordAusgabe(Bookmarks As Variant, cstrVorlage As String, strDatei As String, druck As Long, sichern As String, schliessen As String, frm As Form) As String
Dim sys_verz_be As String
Dim wdApp As Object, wdDoc As Object
Dim wdDoNotSaveChanges As Variant
sys_verz_be = DLookup("[sys_verz_be]", "tblSys", "[sys_pc_name] ='" & pcName & "'")
Set wdApp = CreateObject("word.application")
With wdApp
.Visible = True
Set wdDoc = .Documents.Add(sys_verz_be & cstrVorlage)
End With
With wdDoc
If Me.Briefvorlage = "Mietvertrag" Then
.Bookmarks("Mieter").Range = T_Mieter
.Bookmarks("Mieträume").Range = T_Mieträume
.Bookmarks("Schlüssel").Range = Me.Schlüssel
.Bookmarks("EinzugD").Range = Me.Einzug
.Bookmarks("Kaltmiete").Range = Format(Me.Kaltmiete, "#,##0.00 €")
.Bookmarks("Kaltmiete1").Range = Format(Me.Kaltmiete, "#,##0.00 €")
.Bookmarks("Heizkosten").Range = Format(Me.Heizkosten, "#,##0.00 €")
.Bookmarks("Heizkosten1").Range = Format(Me.Heizkosten, "#,##0.00 €")
.Bookmarks("Nebenkosten").Range = Format(Me.Nebenkosten, "#,##0.00 €")
.Bookmarks("Betribskosten").Range = Format(Me.Nebenkosten, "#,##0.00 €")
.Bookmarks("Sonstigekosten").Range = Format(T_SonstigeKosten, "#,##0.00 €")
.Bookmarks("Gesamtkosten").Range = Format(Me.Kaltmiete + Me.Heizkosten + Me.Nebenkosten + T_SonstigeKosten, "#,##0.00 €")
.Bookmarks("Kaution").Range = Format(Me.Kaution, "#,##0.00 €")
.Bookmarks("Bankdaten").Range = T_Bankdaten
End If
wdApp.Visible = True
If sichern = "ja" Then
.SaveAs FileName:=strDatei
End If
If druck > 0 Then
.PrintOut Copies:=druck
End If
If schliessen = "ja" Then
.Close SaveChanges:=wdDoNotSaveChanges
wdApp.Quit
End If
End With
End Function
kann mir jemand helfen die funktion so umzustellen das ich die Bookmarks extern zusammen stellen kann?
Der Aufruf erfolgt über
WordAusgabe Bookmarks, cstrVorlage, strDatei, Me.Ausdruck, "ja", "ja", Me '
wenn ich die Bookmarks so zusammenstelle
Bookmarks = Array("Adresse", "Betref", "Text")
wie sage ich der Funktion das sie diese nehmen soll ???
ich danke für jeden tip
Soviel ich weiß, kann man Bookmarks gar nicht übergeben. Eine Lesemarke befindet sich im Dokument, an diese kann ein Inhalt zugewiesen werden, und das einzeln, für mehrere also in Schleife.
Auf einmal könnte man übergeben, wenn man alternativ die Serienbrieffunktionalität verwendet und den Platzhaltern (diese dürfen auch mehrfach verwendet werden, während eine Lesemarke einmalig sein muss) eine entsprechende Datenquelle bereitstellt.
Eventuell findet Deine Kostenaufstellung auch tabellarisch statt. Dann könnte man für ein Wordtabelle eine Lesemarke zur Identifizierung verwenden und dann die Tabelle per Zeilen- und Spaltenadressierung füllen, alternativ an eine Lesemarke eine ganze Tabelle, erzeugt aus einem Recordset, übergeben.
Zitat von: Herbert40 am Januar 04, 2023, 14:02:40kann mir jemand helfen die funktion so umzustellen das ich die Bookmarks extern zusammen stellen kann?
Mir ist unklar was du damit überhaupt meinst. Auch deine nachfolgenden Erklärungen machen das nicht klarer.
Willst du die Werte für die Bookmarks komplett an die Prozedur übergeben, und damit den Bezug auf die (vermutlichen) Formularsteuerelemente ersetzen?
Hallo PhilS,
ich habe im Word Dokument an bestimmten Stellen Texmarken gesetzt.
Es wird von Access aus das Dokument geöffnet, dann den Inhalt der Textmarken übergeben,die datei wird gespeichert ausgedruckt und word wird wieder geschlossen.
Im obigen Beispiel ist es ein fertiger Mietvertrag der mit den entsprechenden Daten gefüllt wird.
Da ich aber auch andere Dokumente zum Drucken habe würde ich gerne die Bockmarks nicht in der "Function WordAusgabe" zusammenstellen sondern vorab z.B. in einer eigenen Funktion z.B. "DocErstellung"
Hier möchte ich die endsprechende Dateivorlage und die zu übergebenen Daten festlegen.
Ich hoffe das es jetzt verständlich ist was ich vorhabe.
Gruß Herbert
Gelöst: ich habe eine möglichkeit gefunden.
Aufbereitug der Daten für Übergabe:
'Brieferstellung Me
'WordAusgabe Bookmarks als array, Vorlage dateiangabe mit verzeichnis,speicherort und name, _
"drucken", "speichern", "schliessen nach druck,Formular"
cstrVorlage = "\Vorlagen\Mietvertrag.dotx"
strDatei = sys_verz_be & "Mieter\" & Me.Mi_Kurz_Name & "\out\" & Me.Datei
Bookmarks = Array("Mieter", "Mieträume", "Schlüssel", "Bankdaten", "Einzug", "Kaltmiete", "Kaltmiete1")
WordAusgabe1 Bookmarks, cstrVorlage, strDatei, Me.Ausdruck, "ja", "ja", Me '
Drucken und ausgabe an Word
' Funktion zur Übergabe von Daten an MS Word
Function WordAusgabe1(Bookmarks As Variant, cstrVorlage As String, strDatei As String, druck As Long, sichern As String, schliessen As String, frm As Form) As String
Dim wordObj As Object 'Word.Application
Dim wordDoc As Object 'Word.Document
Dim strMsg As String
Dim bm As Variant
Dim Range As Variant
Dim Copies As Long
Dim wdDoNotSaveChanges As Variant
Dim sys_verz_be As String
sys_verz_be = DLookup("[sys_verz_be]", "tblSys", "[sys_pc_name] ='" & pcName & "'")
Set wordObj = GetWordInstance()
If wordObj Is Nothing Then
strMsg = "Word konnte auf dem Rechner: " _
& Chr$(34) & Environ$("COMPUTERNAME") & Chr$(34) _
& " nicht zur OLE-Automation geöffnet werden."
Exit Function
End If
Set wordDoc = wordObj.Documents.Add(Template:=sys_verz_be & cstrVorlage)
With wordDoc
For Each bm In Bookmarks
If .Bookmarks.Exists(bm) Then
.Bookmarks(bm).Range.Text = Nz(frm(bm))
End If
Next
wordObj.Visible = True
If sichern = "ja" Then
.SaveAs FileName:=strDatei
End If
If druck > 0 Then
.PrintOut Copies:=druck
End If
If schliessen = "ja" Then
.Close SaveChanges:=wdDoNotSaveChanges
wordObj.Quit
End If
End With
Set wordDoc = Nothing
Set wordObj = Nothing
End Function
ich wusste das ich sowas schon mal in einer alten DB hatte und habs gefunden :-)
das einzige Problem was ich noch hane das die Preise gerne Formatiert werden sollten.
Bookmarks = Array("Mieter", "Mieträume", "Schlüssel", "Bankdaten", "Einzug", Format(Me.Kaltmiete, "#,##0.00 €"))
das funktioniert so leider nicht :-(
Hallo!
Was funktioniert nicht?
Die Anweisung mit Array(...) sieht richtig aus.
/edit:
gerade im anderen Code gesehen: du nutzt ja nicht die Werte als Text für die Word-Textmarke, sondern die Array-Werte sind die Steuerelementnamen aus dem Formular.
Zitat For Each bm In Bookmarks
If .Bookmarks.Exists(bm) Then
.Bookmarks(bm).Range.Text = Nz(frm(bm))
End If
Next
Du könntest an die Prozedur den Namen und den Wert je Bookmark übergeben. Das hätte dann auch den Vorteil, dass die Prozedur vom Formular unabhängig wird.
Gruß
Josef
genau dann ahbe ich es doch wie im ersten Beispiel.
oder verstehe ich da was falsch?
im letzten beispiel klappt es ja, nur die formatirung hab ich noch nicht hinbekommen.
Hallo!
Der in #6 gezeigte Ausschnitt aus deinem Code erwartet im Array Bookmark-Namen, die auch noch die Steuerelement- oder Datenfeld-Namen aus dem Formular sind. Wenn du statt dem Namen einen Wert übergibst, wird es diese Textmarke eher nicht geben. ;)
Als Anregung:
Public Function WordAusgabe1(ByRef BookmarkData() As Variant, _
ByVal cstrVorlage As String, ByVal strDatei As String, _
ByVal druck As Long, sichern As Boolean, schliessen As Boolean _
) As String ' Was soll da als String zurückgegeben werden?
...
Dim i As Long
For i = LBound(BookmarkData) To (UBound(BookmarkData) - 1) Step 2
Debug.Print BookmarkData(i), BookmarkData(i + 1)
FillBookmark WordDoc, BookmarkData(i), BookmarkData(i + 1)
Next
...
End Function
Private Sub FillBookmark(ByVal WordDoc As Object, ByVal BookmarkName As String, ByVal BookmarkValue As Variant)
With WordDoc
If .Bookmarks.Exists(BookmarkName) Then
.Bookmarks(BookmarkName).Range.Text = BookmarkValue
End If
End With
End Sub
Aufruf mit:
Dim BookmarkData() As Variant
BookmarkData = Array( _
"Mieter", Me.Mieter.Value, _
"Mieträume", Me.Mieträume.Value, _
"Schlüssel", Me.Schlüssel.Value, _
"Bankdaten", Me.Bankdaten.Value, _
"Einzug", Me.Einzug.Value, _
"Kaltmiete", Format(Me.Kaltmiete.Value, "#,##0.00 €") _
)
WordAusgabe1 BookmarkData, cstrVorlage, strDatei, Me.Ausdruck.Value, True, True