Attenzione: questo articolo dispone di un aggiornamento
Se cerchi la Stampa unione via GMAIL guarda nella sezione "stampa unione".
>>In fondo all’articolo troverete il codice che serve per creare il PDF senza inviarlo via email<<
Carissimi,
Il lavoro di un informatico di bassa lega come me è, spesso, quello di assemblare in poco tempo informazioni per giungere ad un risultato. In questo articolo descrivo i passaggi base per raggiungere il risultato di
- Creare un PDF partendo da una o più pagine word
- Inviare il file appena creato ad un insieme di indirizzi email
Voglio prima di tutto ringraziare Emanuele Mattei (http://emanuelemattei.blogspot.it/) e Word Academy per avermi fornito, ognuno per la sua parte, un ottimo codice VBA.
Prerequisiti:
- Dovete saper usare la stampa unione. Nel caso non lo sappiate, la stampa unione è un ottimo strumento di Word che consente di unire una base di dati (spesso Excel) ad un template fisso (pagina pubblicitaria, attestato et similia) nel quale vengono inseriti sei “segnaposti” che riportano su word alcuni dati (nome, cognome ecc.) “pescati” dalla base di dati. E’ possibile con questo sistema produrre un considerevole numero di documenti stampabili ognuno dei quali differisca dagli altri per alcuni dati, lasciando inalterato il resto del testo.
- Un prerequisito importante è inserire Microsoft Outlook xxx Object Library tra i riferimenti di VBA
Il problema della stampa unione di word è che è pensata, in sostanza, per la stampa, appunto. Dalla versione 2010 (e dalla 2007 con un apposito plugin Microsoft) di Office, Word & compagnia possono produrre autonomamente documenti PDF, senza far uso delle cosiddette “stampanti virtuali PDF”. Peccato che nella stampa unione non vi sia traccia di un sistema di salvataggio alternativo alla stampa.
Ho dunque assemblato due diversi codici per svolgere un’azione combinata:
- Creare, in una cartella a scelta, tanti PDF quanti sono gli indirizzi in elenco
- Inviare Ogni PDF appena creato ad un iindirizzo email
Nell’impostazione dell’origine dati excel sarà bene che inseriate, oltre a eventuali altri filtri specifici, uno specifico filtro che verifichi che il campo contenente l’email NON sia VUOTO.
La routine “pesca” da un campo chiamato “nome e cognome” (VBA lo trasformerà in “nome_e_cognome”) il nome dell’interessato
Passiamo al codice:
Sub Unione_in_pdf()
‘creo un oggetto outlook
Dim obj As New Outlook.Application
‘oggetto che rappresenta l’email
Dim item As Outlook.MailItem
‘instanzio l’oggetto
Set item = obj.CreateItem(Outlook.OlItemType.olMailItem)
‘Crea un oggetto FileDialog per scegliere la cartella in cui salvare i file
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
‘Usa il metodo Show per mostrare la finestra di dialogo e restituire l’azione dell’utente
If .Show = -1 Then
For Each vrtSelectedItem In .SelectedItems
‘vrtSelectedItem è una stringa che contiene l’indirizzo di ogni elemento selezionato.
‘E’ possibile usare qualsiasi funzione di I/O sui file utilizzando questo indirizzo.
selectedpath = vrtSelectedItem
Next vrtSelectedItem
Else
MsgBox (“Nessuna cartella è stata selezionata.”)
Exit Sub
End If
End With
‘Imposta la variabile oggetto a Nothing
Set fd = Nothing
Application.ScreenUpdating = False
MainDoc = ActiveDocument.Name
ChangeFileOpenDirectory selectedpath
For i = 1 To ActiveDocument.MailMerge.DataSource.RecordCount
‘istanzio l’oggetto item per l’email
Set item = obj.CreateItem(Outlook.OlItemType.olMailItem)
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = i
.LastRecord = i
.ActiveRecord = i
‘Utilizza alcuni campi del file sorgente per impostare il nome del file pdf
‘IMPORTANTE: tali campi vanno personalizzati in base a quelli effettivamente
‘presenti nella sorgente dati
‘—–attenti alle righe seguenti: nel database DEVE essere presente il campo denominato “nome e cognome”—-
‘—–ed inoltre un campo denominato “email”——-
docname = “Lettera_” & .DataFields(“nome_e_cognome”).Value & “.pdf”
EmailAddress = .DataFields(“email”).Value
‘ prendiamo il percorso completo del file da allegare
pdfallegato = selectedpath & “\” & docname
‘—-attenti a questa riga: personalizzate a piacimento il messaggio, inteso come corpo del testo——-
messaggio = “Gentilissimo ” & .DataFields(“nome_e_cognome”).Value & ” Le inviamo in allegato la certificazione di partecipazione al convegno.”
‘—-attenti a questa riga: qui mettete l’oggetto del vostro messaggio email—–
SoggettoEmail=”Invio certificato di partecipazione al convegno”
End With
.Execute Pause:=False
Application.ScreenUpdating = False
End With
ActiveDocument.ExportAsFixedFormat OutputFileName:=docname, _
ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
BitmapMissingFonts:=True, UseISO19005_1:=False
ActiveWindow.Close SaveChanges:=False
‘invia tramite outlook
‘imposto il destinatario
item.To = EmailAddress
‘imposto il corpo del messaggio
item.Body = messaggio
‘imposto l’oggetto del messaggio
item.Subject = SoggettoEmail
‘allegato
Set allegato = item.Attachments
allegato.Add pdfallegato
‘invio l’email
item.Send
Set item = Nothing
Next i
Application.ScreenUpdating = True
End Sub
[mx_youtuber type="video" id="izlQ9osMfz4"]
[mx_youtuber type="video" id="uYugLf4vv7U"]
Come creare solo il PDF senza inviarlo via email
Mi è stato richiesto più volte ed ecco qui il codice emendato dalla parte che si occupa dell’invio tramite outlook in modo tale che possiate salvare nella cartella selezionata il PDF e… e basta! qui trovi il file di esempio (12B).
Sub Unione_in_pdf()
'Crea un oggetto FileDialog per scegliere la cartella in cui salvare i file
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
'inizia procedura
With fd
'Usa il metodo Show per mostrare la finestra di dialogo e restituire l'azione dell'utente
If .Show = -1 Then
For Each vrtSelectedItem In .SelectedItems
'vrtSelectedItem è una stringa che contiene l'indirizzo di ogni elemento selezionato.
'E' possibile usare qualsiasi funzione di I/O sui file utilizzando questo indirizzo.
selectedpath = vrtSelectedItem
Next vrtSelectedItem
Else
MsgBox ("Nessuna cartella è stata selezionata.")
Exit Sub
End If
End With
'Imposta la variabile oggetto a Nothing
Set fd = Nothing
Application.ScreenUpdating = False
MainDoc = ActiveDocument.Name
ChangeFileOpenDirectory selectedpath
For i = 1 To ActiveDocument.MailMerge.DataSource.RecordCount
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = i
.LastRecord = i
.ActiveRecord = i
'Utilizza alcuni campi del file sorgente per impostare il nome del file pdf
'IMPORTANTE: tali campi vanno personalizzati in base a quelli effettivamente
'presenti nella sorgente dati
'-----attenti alle righe seguenti: nel database DEVE essere presente il campo denominato "nome e cognome"----
'-----ed inoltre un campo denominato "email"-------
docname = "Lettera_" & .DataFields("nome_e_cognome").Value & ".pdf"
' prendiamo il percorso completo del file da allegare
pdfallegato = selectedpath & "\" & docname
End With
.Execute Pause:=False
Application.ScreenUpdating = False
End With
ActiveDocument.ExportAsFixedFormat OutputFileName:=docname, _
ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
BitmapMissingFonts:=True, UseISO19005_1:=False
ActiveWindow.Close SaveChanges:=False
Next i
Application.ScreenUpdating = True
End Sub