vba e mailmerge continua



  • vba e mailmerge, continua...
    di roberto21 (utente non iscritto) data: 13/05/2013 20:01:29

    Se pensate che i miei guai con mailmerge e vba siano finiti, vi sbagliate. Devo ammettere che qui non credo sia il mailmerge in sè a dare problemi, ma il nuovo guaio è sempre lì. Se l'amico vecchio frac non si è stufato, ridescrivo lo scenario.
    Con due form e relativo codice, gestisco inserimenti e modifiche del database di una associazione locale. Una delle funzioni presenti è la stampa di una lettera diciamo di "sommario" da inviare al socio, generata appunto con il mailmerge: la routine (sempre riportata sotto) viene chiamata con la chiave "numerotessera", seleziona il record, riempie i campi e stampa. In particolare, nel caso di inserimento di un nuovo record, la routine è chiamata subito dopo l'inserimento stesso, quindi stampa l'ultimo record del database.
    Il problema è il seguente. Quando il codice gira sul mio pc o sul computer "ufficiale" dell'associazione, sembra che tutto funzioni. Quando gira sul computer di casa del mio amico, si nota che il file word viene aperto e poi richiuso senza stampare nulla (e senza segnalare errori). Se, a questo punto, si prova a stampare la lettera chiamando la routine dal codice dell'altro form (quello di modifica), analogamente word parte, termina e non stampa nulla. Siccome, come dicevo, sul mio pc funziona tutto, non riesco nemmeno a capire che cosa dovrei guardare: esito molto a citare che la differenza fra i computer dove funziona e il computer dove non funziona è che quest'ultimo ha Vista, gli altri hanno WIN7. Secondo voi, potrebbe entrarci qualcosa?
    Approfitto per un'altro dubbio: visto che nel codice la stampa avviene già con .destination = wdSendToPrinter, gli statements successivi

    With .DataSource
    .FirstRecord = wdDefaultFirstRecord
    .LastRecord = wdDefaultLastRecord
    End With

    servono a qualcosa?

    Grazie
     
    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: 13/05/2013 20:21:57

    cit. " Se pensate che i miei guai con mailmerge e vba siano finiti, vi sbagliate."
    ---> LOL!

    Io però per stasera passo, mi dispiace. Giornate troppo incasinate queste per me.
    Domani a mente più lucida vedrò di rileggere meglio il tuo post, non offenderti ^_^





  • di Vecchio Frac data: 14/05/2013 18:02:18

    Ecco, ho riletto e anche con attenzione.
    Sinceramente sento la mancanza di una sfera di cristallo :)
    Windows Vista di per sè è stato un sistema operativo non molto ben riuscito, diciamo che potrebbe anche dipendere dalla piattaforma,... però lo trovo improbabile.
    Non dici le versioni di Office coinvolte, presumo che siano le stesse.
    I percorsi dei file sono i medesimi? la lettera tipo esiste con lo stesso nome? la base dati è disponibile e non è protetta?
    Per FirstRecord e LastRecord, puoi provare a settarli a uno in modo da stampare solo il primo record, ma non devono darti problemi (i dati vengono prelevati dalla base dati).
    Adesso non mi viene in mente altro :(





  • di roberto21 (utente non iscritto) data: 14/05/2013 18:55:46

    Non vedo perchè dovrei prendermela, sei sempre gentilissimo.
    Anch'io dubito circa Vista e win7, ma come citavo in altra occasione, "quando hai eliminato tutto il resto quello che rimane, anche se improbabile, deve essere la soluzione" (Sherlock Holmes). Avevo già verificato quello che suggerisci, ma guarderò di nuovo. Le versioni di Office NON sono le stesse, io lavoro con 2010, gli altri due pc usano office2007, ma "purtroppo" uno funziona e uno no.
    I files sono identici, la base dati non è protetta (tanto è vero che anche là dove non funziona il record è stato inserito correttamente). I percorsi dei files potrebbero essere diversi, ma in ogni caso la stampa funziona regolarmente su tutti i record tranne l'ultimo, e la sub chiamata è sempre la stessa. Avevo pensato ad un malfunzionamento del meccanismo (di excel2007/2010) di espansione automatica delle tabelle cui accennavo in un altro post: se per caso aggiungo un record e il meccanismo non funziona, "rangesoci" potrebbe non allargarsi, e la ricerca del record fallisce, ma 1) mi aspetterei un errore quando lo SQL statement va a cercarsi il numerotessera e comunque 2) ho messo un breakpoint prima di openDataSource, ho controllato il range ed è stato effettivamente allargato...
    Continuerò a meditare. Per intanto, grazie infinite per la pazienza.



  • di Vecchio Frac data: 14/05/2013 20:18:24

    cit. "Le versioni di Office NON sono le stesse"
    ---> Uhm :( anche se in realtà tra 2007 e 2010 non ci dovrebbero essere grandi differenze.

    E comunque confermi (come vedo dal codice) che non c'è nessuna trappola per errori (On Error Goto ...) attivata.
    Proverò a ricostruire lo scenario (lettera tipo e base dati) per fare una prova qui (Win7, Office XP in reale, Office 2010 in virtuale).

    cit. "in ogni caso la stampa funziona regolarmente su tutti i record tranne l'ultimo"
    ---> questo è stranissimo, magari dobbiamo controllare i valori proprio di .FirstRecord e .LastRecord tra le due versioni di Office.





  • di Vecchio Frac data: 14/05/2013 20:49:04

    Ma sul pc del tuo amico, il mailmerge manuale funziona?





  • di roberto21 (utente non iscritto) data: 14/05/2013 20:50:22

    Esatto, non ci dovrebbero essere grosse differenze e inoltre, come dicevo, dei due pc con office 2007 uno funziona e uno no.
    I valori delle costanti, per quello che ho visto, sono rispettivamente 1 e -16 sia per 2010 che per 2007.
    Grazie ancora per l'interessamento



  • di Vecchio Frac data: 14/05/2013 21:08:06

    Da Office XP (Excel + Word 2003), il tuo codice funziona che è una meraviglia (ho solo cambiato la destinazione, da stampante a documenti, wdSendToNewDocument, ottenendo un unico documento con una pagina per ogni riga di dati).
    Anche l'ultimo record viene prodotto correttamente.
    L'unica correzione che ho fatto al tuo codice è sull'ultima riga:
    Set appWord = CreateObject(Class:="Word.Application")
    perchè appWord non era mai stata dichiarata in precedenza e l'ho riscritta così:
    Set WordApp = CreateObject(Class:="Word.Application")

    Brancolo quindi nel buio, ora non mi resta che trasportare tutto in virtuale su Office 2010 (domani in ufficio potrei provare sul 2007) e vedere cosa succede.





  • di Vecchio Frac data: 14/05/2013 21:09:03

    Potrebbe trattarsi dei percorsi.
    Troppo lunghi, o con caratteri strani.





  • di roberto21 (utente non iscritto) data: 14/05/2013 23:55:42

    Ultima entry per oggi, poi vado a dormire.
    1) mailmerge manuale. Be' credo di sì, usiamo lo stesso database per riempire e (e stampare) le tessere di riconoscimento, e questa funzione la facciamo in manuale. Comunque, proverò, tanto per essere sicuro: sono certo che funziona con office2007 sul pc in ufficio (win7), non ricordo se l'abbiamo usata sul pc di casa sua, dove il mio codice non funziona (VISTA).
    2) scusa, se i percorsi dei files avessero problemi, visto che il codice non cambia, avrei difficoltà anche con qualsiasi altro record... o no?

    Per ora... buonanotte. Magari la notte porta consiglio.



  • di Vecchio Frac data: 15/05/2013 10:54:13

    Ad 2):
    non ne sarei così sicuro... non per niente Vista era pieno di bachi ;)





  • di roberto21 (utente non iscritto) data: 16/05/2013 15:53:58

    OK, ho riprovato dall'amico a generare la tessera con il procedimento di mailmerge manuale, selezionando l'ultimo record, e la cosa sembra funzionare senza problemi. Il che ci lascia esattamente dove eravamo prima...



  • di Vecchio Frac data: 16/05/2013 18:32:18

    Purtroppo sì.
    Non capisco da cosa possa dipendere.
    Ho provato con tre versioni di Office diverse, il codice funziona alla perfezione e non si perde neanche un record.
    La versione (di Word, di Office in generale) dal tuo amico dove riscontriamo i problemi con il codice è localizzata in italiano?





  • di roberto21 (utente non iscritto) data: 16/05/2013 19:16:25

    Italiano. Strano a dirsi, avevo pensato anch'io a qualcosa del genere, anche se non avrebbe comunque alcun senso. Office in sede dell'associazione e a casa del mio amico è 2007 italiano, io preferisco lavorare con 2010 inglese US (perchè trovo più semplice leggere i vari suggerimenti su internet...). In ogni caso, visto che un 2007 funziona e uno no, il problema è altrove. Pazienza, l'importante è che funzioni in associazione. Magari col tempo ci verrà in mente qualcosa.



  • di Vecchio Frac data: 16/05/2013 20:43:37

    A volte anche la localizzazione influisce.
    Quali sono, esattamente, le versioni dei Word 2007 interessate? cioè quello dell'associazione e quello del tuo amico.
    Intendo dire il numero di versione che si ricava :

    Sulla mia versione di Word 2007:
    Pulsantone di Office, Opzioni di Word, Risorse, ultima voce: Informazioni su Word:
    Microsoft Office Word 2007 (12.0.4518.1014), MSO (12.0.4518.1014 )

    Nell'editor VBA:
    click sul punto interrogativo (ultima voce di menu dopo "Finestra"): Microsoft Visual Basic 6.3, versione 1020, VBA Retail 6.5.1020, Forms3 12.0.4518.101

    Se in entrambe le installazioni i numeri di revisione sono identici, si dovrà per forza pensare a qualcos'altro... tipo un bug del sistema del tuo amico (ma strano che il mailmerge manuale funzioni correttamente, è qui che rimango sorpreso).





  • di roberto21 (utente non iscritto) data: 19/05/2013 00:33:11

    Ho fatto un'altra prova, e forse questa potrebbe portarci a qualche conclusione. Apro l'applicazione, scelgo l'opzione "aggiungi nuovo iscritto". Il record viene aggiunto al database (verificato), viene chiesto se voglio stampare la lettera relativa, ma se dico sì la lettera NON viene stampata. Senza uscire dall'applicazione, passo alla opzione "modifica esistente": qui un command button mi consente di stampare la stessa lettera specificando il numero tessera (e usando la stessa sub); se indico il numero dellla tessera relativa al record appena aggiunto, la lettera NON viene stampata. Ma, se chiudo l'applicazione e la riapro, e vado su "modifica esistente", specificando la tessera dell'ultimo record la stampa funziona OK.
    Attenzione,questo è il comportamento sul Vista del mio amico; sul computer mio e dell'ufficio, la stampa è ok anche se non chiudo e riapro l'applicazione. Ci porterà da qualche parte questa differenza?
    PS Mi sono dimenticato di controllare le versioni...