STAMPA UNIONE CON WORD 2007

di Anonimizzato13810 il
9 risposte
Buonasera a tutti,
ho creato un comando che fa la stampa unione in word utilizzando una tabella di access. la tabella di access contiene sempre un record diverso.
Il mio codice è questo:

DoCmd.SetWarnings (WarningsOff)
DoCmd.OpenQuery "SELDATILAVVOL"
Dim word As Object
Dim Doc As Object
Dim filepath As String


Set word = CreateObject("Word.Application")

word.Visible = True


filepath = "C:\Lettera azienda CRI 2018.docx"
Set Doc = word.Documents.Open(filepath)


Non capisco perchè quando apro il file di word i dati inseriti dei campi unione sono sempre uguali anche se i dati della tabella sono diversi.
Penso che dovrei inserire un comando per rileggere i dati della tabella ma non so quale comando usare.
Qualcuno mi può aiutare? Grazie.

Giuseppe

9 Risposte

  • Secondo me devi leggere i dati in tabella. Prova a leggere qui
    **

    P.S.: quando scrivi codice VBA o SQL, ricorda di selezionarlo e cliccare sul tasto in alto Code per farlo apparire poi con i tipici caratteri monotype, preferiti al colpo d'occhio dei programmatori.
  • Grazie Osvaldo ho provato come mi hai detto facendo leggere i dati in tabella, ma il problema secondo me è in word che quando si apre il file non reinserisce i dati della tabella che son cambiati.
    Se apro il file di word da solo mi chiede se voglio inserire nel file i dati del database e confermando mi inserisce i dati nuovi modificati. Se lancio invece il comando da pulsante comando mi apre il file di word ma ci sono i dati vecchi non aggiornati.
    Questo è il codice aggiornato:
    DoCmd.SetWarnings (WarningsOff)
    DoCmd.OpenQuery "SELDATILAVVOL"
    Dim Tabella As DAO.Recordset
    
    Set DBCorrente = CurrentDb
    'Set Tabella = DBCorrente.OpenRecordset("ANAGMODDATLAV", dbOpenDynaset)
    Set Tabella = DBCorrente.OpenRecordset("Select * from ANAGMODDATLAV", dbOpenDynaset)
    
    Do Until Tabella.EOF
        MsgBox Tabella.Fields("A_MATRICOLA")
    
        'vai al dato successivo
        Tabella.MoveNext
    Loop
    
    Tabella.Close
    DBCorrente.Close
    
        Dim word As Object
        Dim Doc As Object
        Dim filepath As String
    
        
        Set word = CreateObject("Word.Application")
        
        word.Visible = True
        
    
        filepath = "C:\Lettera azienda CRI 2018.docx"
        Set Doc = word.Documents.Open(filepath)
    Grazie ancora.
    Giuseppe
  • Non hai popolato Word con i dati di Access, magari leggi questo documento ove sono descritte diverse modalità con cui operare:
    http://www.brileigh.com/microsoft-access/document-generation-with-microsoft-word-and-microsoft-access/

    In generale, puoi automatizzare la stampa unione sfruttando (da Access) la automazione degli oggetti forniti da Word.

    Nel particolare vedi i seguenti link, in inglese, ove trovi diverse soluzioni, come:

    - stabilire la fonte dati per l'esecuzione del MailMerge
    https://stackoverflow.com/questions/20424161/access-and-word-2010-merging-one-record-depending-on-subform-button-clicked
    https://access-programmers.co.uk/forums/showthread.php?t=240931

    - agire sui segnalibri (Bookmarks) per assegnarvi i dati
    http://www.simply-access.com/ExportDatatoWord.htm
    https://stackoverflow.com/questions/35782214/access-vba-merging-word-template-with-query
    https://stackoverflow.com/questions/46072913/ms-access-form-data-export-to-word

    - operare sulla Doc.Tables (di Word) dando alle Tables.Cell i valori dei campi del recordset di Access
    https://www.devhut.net/2012/04/23/ms-access-vba-export-records-to-ms-word/

    - imputare i valori nei Fields
    https://social.msdn.microsoft.com/Forums/office/en-US/0a479546-d2f1-4e27-8dd9-ba7d70865124/pushing-a-recordset-to-word-template?forum=accessdev
  • Grazie willy55 per risposta.
    Ti metto qui il codice per fare il push dei dati tabella access to word. Mi apre il file di word ma senza i dati della tabella non capisco dove sbaglio.
    [code]Private Sub Anagrafica_Click()
    DoCmd.SetWarnings (WarningsOff)
    DoCmd.OpenQuery "SELDATILAVVOL"
    
    Dim Tabella As DAO.Recordset
    
    Set DBCorrente = CurrentDb
    
    
    Dim wapp As Object
    Dim wdoc As Object
    Dim db As DAO.Database
    Dim fld As DAO.Field
    Dim rs As DAO.Recordset
    Dim filenm As String
    Dim NumFields As Integer
    Dim i As Integer
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("ANAGMODDATLAV")
    
    Set wapp = CreateObject("Word.Application")
     wapp.Visible = True
    
    
    Set rs = DBEngine(0)(0).OpenRecordset("SELECT * FROM ANAGMODDATLAV")
    
    If rs.RecordCount > 0 Then
      rs.MoveFirst
    
      Do While Not rs.EOF
         For i = 0 To rs.Fields.Count - 1
            Set fld = rs.Fields(i)
            
            
            Debug.Print fld.Name, fld.Value
                'If fld.Value = 16 Then
                    filenm = "C:\Lettera azienda CRI 2018.docx"
                        Set wdoc = wapp.Documents.Open(filenm)
                        
                    wapp.ActiveDocument.Variables("datorelavoro").Value = rs.Fields("datorelavoro").Value
                    
                    'ActiveDocument.Fields.Update
    
               'End If
         Next
         rs.MoveNext
      Loop
      Set fld = Nothing
      rs.Close
    End If
    Set rs = Nothing
    
    End Sub
    [/code]
  • Il codice da te implementato ha poco senso, in quanto effettui un ciclo per tutti i Fields del Recordset e poi ne prendi in considerazione solo uno ("datorelavoro").
    Inoltre visto che devi effettuare la stampa unione la variabile di Word deve essere assegnata a quella di MailMerge.
    Ti consiglio di rivedere la logica con cui vuoi automatizzare il processo e, magari, inserisci la gestione degli errori e segui con il debug il codice realizzato (in modo da verificare il contenuto delle variabili con cui operi).
    Con l'occasione puoi leggere questi ulteriori link che trattano l'argomento per gli aspetti di:

    - automazione della stampa unione in VBA
    https://rtmccormick.com/2015/11/23/automatic-mail-merge-with-vba-and-access/
    https://support.microsoft.com/it-it/help/285332/how-to-automate-word-with-visual-basic-to-create-a-mail-merge

    - Bookmarks
    http://www.brileigh.com/microsoft-access/document-generation-with-microsoft-word-and-microsoft-access/
    http://www.blueclaw-db.com/mail-merge-bookmarks.ht

    - FormFields del documento
    https://www.techrepublic.com/blog/how-do-i/how-do-i-dynamically-fill-microsoft-word-fields-using-access-data/
    https://bytes.com/topic/access/answers/206145-collections-mail-merge-word-formfields

    - MailMerge.Fields
    https://stackoverflow.com/questions/49804968/how-do-i-insert-a-mergefield-into-an-if-else-statement-in-vba-using-word-mailme
    https://stackoverflow.com/questions/15824115/change-value-of-word-mailmerge-field-using-vba
  • Devo prendere solo tre campi del record analizzato. la tabella contiene solo un record.come faccio a individuare via codice i tre campi inseriti nel file di word? grazie ciao Giuseppe
  • In base a quanto descrivi, nascono tutta una serie di dubbi sulle soluzioni da te adottate.
    Nel particolare indichi di impiegare una tabella con un solo record, ove ti interessano solo tre dei sui campi.
    Premesso quindi che la stampa unione (o mail merge) di Word è pensata per partire da un documento unico (di norma un modello) ove attraverso la personalizzazione (fornita dall'insieme dei dati, quali tabella/query di Access o elenco direttamente di Word) si vanno ad ottenere tante copie del documento originario, con alcuni parti aggiornate con i valori provenienti, appunto, dalla origine dati.
    Quindi in un impiego normale si impiegano più record in modo da ottenere ad esempio lettere circolari, buste, etichette da preparare per la stampa da inviare all'insieme dei soggetti presenti nell'elenco fornito dalla origine dei dati.
    Quindi sarebbe da comprendere quale sia l’effettiva esigenza di avere una tabella con un solo record.
    Inoltre dovresti essere a conoscenza dei nomi per i tre campi della tabella che ti interessano per generare il documento da produrre nella stampa unione.
    Da considerare che (trattandosi di un solo record ed esclusivamente tre specifici campi) è come se i dati fossero fissi e quindi da valutare se applicare codice VBA.
    Pertanto ti invito (prima di affrontare la soluzione con codice VBA) di partire dalle basi, osservando come sia possibile in modo interattivo creare un'operazione di stampa unione mediante la “Creazione guidata Stampa unione di Microsoft Word” (sia attraverso Access che Word stesso):
    https://support.office.com/it-it/article/usare-la-stampa-unione-per-inviare-dati-a-word-053cc639-fe30-4d3a-943d-0bee0892f16a
    https://support.office.com/it-it/article/utilizzare-una-tabella-o-una-query-come-file-di-dati-per-la-stampa-unione-860ef4bc-e793-4004-8a1b-5c8a34c7e89d

  • Grazie mille per tue risposte.
    Ti illustro il progetto.
    ho un file di word con dentro campi unione (datore lavoro, indirizzo, città) prelevati dal database access.
    Private Sub Anagrafica_Click()
    DoCmd.SetWarnings (WarningsOff)
    DoCmd.OpenQuery "SELDATILAVVOL"
    
     Dim word As Object
     Dim Doc As Object
        
       Dim filepath As String
        Set word = CreateObject("Word.Application")
        word.Visible = True
        
       filepath = "C:\Lettera azienda CRI 2018.docx"
        
       Set Doc = word.Documents.Open(filepath)
    
    End Sub
    Eseguo una query che mi crea una tabella con solo i dati del dipendente sezionato (SELDATILAVVOL) e quindi c'è solo un record.
    Poi apro il file di word che dovrebbe avere i dati aggiornati in funzione della tabella creata.
    Se apro il file di word da solo ovvero da windows esce questa segnalaione:

    "Se si apre questo documento verrà eseguito il seguente comando SQL" confermando SI vengono caricati correttamente i dati in word secondo la tabella creata.
    Da codice inserito e allegato sopra io apro il file di word ma non mi esce questo avviso e quindi i dati visualizzati son quelli della precedente apertura word.
    spero di essere stato chiaro.
    Giuseppe
  • Ho risolto, ho aggiunto

    word.DisplayAlerts = True
Devi accedere o registrarti per scrivere nel forum
9 risposte