Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Bookmarks Übergabe an Word

Begonnen von Herbert40, Januar 04, 2023, 14:02:40

⏪ vorheriges - nächstes ⏩

Herbert40

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

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

PhilS

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?
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Herbert40

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

Herbert40

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 :-)

Herbert40

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 :-(

Josef P.

#6
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

Herbert40

#7


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.

Josef P.

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