mailmerge e vba



  • mailmerge e vba
    di roberto21 data: 27/04/2013 00:48:19

    Mi trovo costretto a ricorrere all'esperienza dei partecipanti a questo forum per un problema. Ho già avuto modo di chiedere lumi sul mailmerge gestito via vba, e mi sembrava di aver capito e risolto. Magari qualcuno (vecchio frac) ricorda il problema. Ora mi sono accorto che succede una cosa strana.
    Ricapitolo: ho un data base contenente i dati di persone di una associazione locale, che gestisco tramite forms e codice vba. In questo database ci sono un paio di date (nascita, scadenza documento identità, etc), che sul foglio appaiono regolari (sono formattati come short date, gg/mm/aaaa). A parte tutto il resto, una delle funzioni è stampare una lettera a partire da un record, e riesco a farlo tramite il mail merge (codice riportato sotto). Quello che succede è che in maniera apparentemente random (ma penso di non avere ancora trovato il pattern nascosto) nella lettera le date appaiono come numeri, date non formattate (es. 04/09/1958 ==> 21432)
    Inutile precisare che se faccio il mail merge direttamente da word, agganciando con lo stesso file (lettera) lo stesso database, tutto funziona perfettamente.
    Qualcuno sa indirizzarmi verso una possibile causa? Grazie in anticipo

    Roberto
     
    Sub PrintLetter2(numerotessera As String)
    'Mail merge e stampa su stampante di default
    
    'On Error GoTo ErrorHandler
    
    ' open template in Word
    Dim filepath As String
    Dim WordApp As Word.Application
    Dim WordDoc As Word.Document
    Set WordApp = New Word.Application
    filepath = ThisWorkbook.Path
    Debug.Print filepath, numerotessera
    With WordApp
        .Visible = True
        Set WordDoc = .Documents.Open(filepath & "LetteraNuoviSoci.docx")
    End With
    'MailMerge selected records from table to Word document
    With WordApp
        .ActiveDocument.MailMerge.OpenDataSource Name:=filepath & "" & ThisWorkbook.Name, _
            ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
            AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
            WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
            Format:=wdOpenFormatAuto, _
            SQLStatement:="SELECT * FROM `rangesoci` WHERE [Numero Tessera] =" & numerotessera, SQLStatement1:="", _
            SubType:=wdMergeSubTypeAccess
        With .ActiveDocument.MailMerge
            .Destination = wdSendToPrinter
            .SuppressBlankLines = True
                          
            With .DataSource
                .FirstRecord = wdDefaultFirstRecord
                .LastRecord = wdDefaultLastRecord
            End With
            .Execute Pause:=False
        End With
               
    End With
    
    WordDoc.Close SaveChanges:=False
    WordApp.Quit
    
    ErrorHandlerExit:
    Exit Sub
    ErrorHandler:
    If Err = 429 Then
    'word is not running; open word with CreateObject
    Set appWord = CreateObject(Class:="Word.Application")
    End If
    
    End Sub



  • di Vecchio Frac data: 27/04/2013 20:46:34

    cit. " nella lettera le date appaiono come numeri"
    ---> E' normale, sai già che in Excel le date sono memorizzate come numeri (e visualizzate mediante l'impostazione della cella, che Excel tende ad indovinare per noi mostrando subito la data nel formato corretto).
    E' curioso che il mailmerge diretto venga interpretato correttamente.
    Purtroppo non ho lo scenario per riprodurre il problema.
    Si rende necessaria una ricerchina :)
    Probabilmente si deve intervenire direttamente sul formato di dato recuperato dal nome del campo interessato:
    With ActiveDocument.MailMerge.DataSource
    .DataFields("LastName").Value = CDate(.DataFields("LastName").Value)
    End With






  • di Vecchio Frac data: 27/04/2013 21:26:47

    Sembra un problema noto...
    Mi sto scontrando con questo articolo Microsoft:
    support.microsoft.com/kb/320473
    che suggerisce di utilizzare il mailmerge da Word (DDE) e non via codice.
    Uhm...





  • di Vecchio Frac data: 27/04/2013 21:37:19

    Proviamo questa soluzione.
    Nella lettera-tipo di Word, in corrispondenza del campo che contiene la data da visualizzare nel formato desiderato, proviamo a esplicitare il formato di data che vogliamo vedere. Per fare questo, portati sul campo della data e premi Maiusc-F9 per visualizzare il codice del campo. Quindi modifica il campo come segue (ipotizziamo che si chiami my_date):

    «my_date» ---> selezionare e premere Maiusc-F9;
    { MERGEFIELD "my_date" @ "dd/MM/yyyy" } ---> integrare con il formato data dd/MM/yyyy
    fai di nuovo Maiusc-F9 per visualizzare il risultato e non il codice di campo

    Salva la lettera tipo e fai girare il codice.
    Fammi sapere :)





  • di roberto21 (utente non iscritto) data: 28/04/2013 10:29:04

    Sempre gentilissimo, grazie mille. Sto cercando di capire se ci sia una logica dietro questo, visto che a volte va e a volte no, e siccome il database non è mio, nel senso che ci sto lavorando sopra su richiesta di un amico, sto trovando un po' di confusione. Per esempio, se alla colonna contenente le date tolgo TUTTE le formattazioni (per cui excel mi mette General), alcune date diventano numeri (come mi aspettavo), ma altre restano dd/mm/aaaa, allineate a sinistra, come se fossero testo normale: ma a questo punto, se le riformatto come data, Excel non dovrebbe riconoscerle come tali e quindi, togliendo ancora il formato, visualizzarle come numeri? Mi sfugge qualcosa.
    Qui c'è una risposta che menziona la questione DDE, ma la sconsiglia:

    answers.microsoft.com/en-us/office/forum/office_2007-word/mail-merge-date-as-formatted/3b96f318-9fdc-47df-baac-d48216b69b38

    La soluzione di integrare il formato nel campo MERGEFIELD mi sa che non è applicabile al mio caso. Il codice che uso aggancia dinamicamente ogni volta il file word al database excel, per cui sono stato costretto (ma forse non è vero, magari c'è un modo che non conosco), dopo aver preparato i field mergefield all'inizio, a rendere il file word "normale", cioè non pronto per il mailmerge: altrimenti, quando lo apro, mi compare il messaggio "questo file ha dei link con ....etc etc", per cui si ferma e aspetta risposta, cosa che non mi va bene nell'esecuzione della macro. Comunque ci provo, magari excel è più furbo di quanto pensi. Ti farò sapere.



  • di roberto21 data: 28/04/2013 11:22:24

    So che la cosa ti turberà, come ha turbato me... Ho provato quanto suggerito (aggiunto @ "dd/MM/yyyy") e mi sono rimasti i numeri, invece che in TimesNewRoman scritti in Courier...



  • di Vecchio Frac data: 28/04/2013 13:33:20

    cit. " So che la cosa ti turberà, come ha turbato me"
    ---> LOL, ormai alle stranezze di casa Micro$oft ci si deve abituare per forza ^_^

    cit. "ma altre restano dd/mm/aaaa, allineate a sinistra"
    ---> allora il problema è proprio nel file originale, formatta la colonna come data e poi ricopiala a fianco, incolla speciale, valori, quindi elimina la colonna originale e mantieni questa.

    cit. "Il codice che uso aggancia dinamicamente ogni volta il file word al database excel"
    ---> Ma il modello di lettera dovrebbe prevedere comunque dei campi unione altrimenti come fa il motore di mail merge a sapere quale dato associare ai campi?

    L'idea di smanettare direttamente sui .DataFileds non mi piace molto, vediamo se non ci sono altre soluzioni.





  • di roberto21 (utente non iscritto) data: 28/04/2013 21:51:24

    Ho ricostruito le colonne delle date, ma ho dovuto operare diversamente, perchè formattare come date non serve a niente (oltretutto erano già formattate come date). Ho usato una colonna extra, ho dovuto ricorrere alla funzione datevalue per rigenerare la data dal testo, e poi ho ricopiato la nuova colonna sulla vecchia. Così ho risolto qualche problema, ma qualche data si ostina ad apparire come numero. Ripasserò in esame il codice, magari ora sbaglio a generare le date per riempire i campi. Ma MS non può trovare un sistema meno incasinato per queste date?