Stampa unione e VBA: creare PDF e inviarli via email in HTML – parte 3

Insomma, dopo tante richieste ho deciso di uscire dal torpore e inventarmi un piccolo escamotage per risolvere il problema dell’incorporamento di informazioni estratti dall’origine dati inserendole in un HTML.

Chi non conosce lo HTML non deve spaventarsi. Ho cercato di rendere davvero semplice l’introduzione a questa tecnologia riducendo davvero all’essenziale le spiegazioni.

I due file necessari sono reperibili nella sezione LAB-Download al punto 12TER.

Per chi capitasse qui per caso, sottolineo che questo tutorial è l’ultimo di una serie di tre dedicati sostanzialmente alla stampa unione. Facendo uso di VBA ho spiegato come, invece di stampare i contenuti, poterli inviare via email facendo uso di MS-Outlook allegando anche un PDF, molto utile nel caso, ad esempio, di invio massivo di attestati, manuali ecc. Con questo tutorial, come avete letto, cerco di rendere più gradevole il testo del messaggio email facendo uso di HTML. In questo modo, nel testo del messaggio, sarà possibile inserire tutta la formattazione necessaria ai testi, immagini, link.

Vi riporto il codice HTML utilizzato nell’esempio:

<!DOCTYPE html>
<html>
<body>
<h2>Buongiorno&nbsp;</h2>
<p>Ti stiamo inviando copia dell'attestato per l'aver frequentato e superato con successo il corso</p>
<p><strong>ilcorso&nbsp;</strong></p>
<p>Ti salutiamo cordialmente</p>
<p>La commissione</p>
<h2><img src="https://pngimage.net/wp-content/uploads/2018/06/flower-logo-png-2.png" alt="a free logo" width="200" /></h2>
</body>
</html>

Ecco il video. Buon lavoro!

 

[mx_youtuber type="video" id="c3tAT7ZTssQ"]

 

Qui invece l’intero codice della macro (VBA):

Sub Unione_in_pdf()

Dim strFilename As String
Dim MyHTMLMessage As String, MyHTMLBody As String, MessaggioHTMLFinale As String, Utente As String
Dim iFile As Integer: iFile = FreeFile
'DIAMO PER SCONTATO CHE:
'1) IL FILE CHE CONTIENE LO html STATICO SIA SUL DESKTOP
'2) CHE IL FILE SIA DENOMINATO "myhtmlmessage.txt"
Utente = (Environ("USERPROFILE")) & "\DESKTOP\"
strFilename = Utente & "myhtmlmessage.txt"
'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)
'carica il messaggio HTML che contiene la parte finale HTML
Open strFilename For Input As #iFile
MyHTMLMessage = Input(LOF(iFile), iFile)
Close #iFile
'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
 
'instanzio 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"
'parte fissa dello HTML minimale
'ricordiamoci che ogni singola riga dovrà andare a capo con chr$(15)
MyHTMLBody = "<!DOCTYPE html>" & Chr$(15)
MyHTMLBody = MyHTMLBody & "<html>" & Chr$(15)
MyHTMLBody = MyHTMLBody & "<body>" & Chr$(15)
'aggiungiamo nome e cognome al body
MyHTMLBody = MyHTMLBody & "<h2>Buongiorno&nbsp;" & .DataFields("nome_e_cognome").Value & "</h2>" & Chr$(15)
MyHTMLBody = MyHTMLBody & "<p>Ti stiamo inviando copia dell" & Chr$(39) & "attestato per avere frequentato e superato con successo il corso</p>" & Chr$(15)
'ricorda che il simbolo doppi apici è chr$(34)
MyHTMLBody = MyHTMLBody & "<p><strong>" & Chr$(34) & .DataFields("Motivazione").Value & Chr$(34) & "</strong></p>" & Chr$(15)

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 Corso"
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
item.Display
'imposto il destinatario
item.To = EmailAddress
'imposto l'indirizzo Carbon Copy
'item.CC = ""
'imposto il corpo del messaggio
'item.Body = messaggio
'componiamo tutto lo HTML
MessaggioHTMLFinale = MyHTMLBody & MyHTMLMessage

item.HTMLBody = MessaggioHTMLFinale
'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
MessaggioHTMLFinale = ""
Application.ScreenUpdating = True

End Sub

Stampa unione e VBA: creare PDF (e tenere traccia di ciò che si è stampato) – parte 3

 pdfcreate

Si tratta in sostanza di una “piccola” evoluzione di due precedenti tutorial il cui scopo è quello di consentire di tenere traccia di quali record sono stati elaborati dalla stampa unione in passato.

Questo utile “stratagemma” consente dunque di inserire nuovi record alla base di dati senza dover cancellare i precedenti.

Ecco il codice da me utilizzato nellesempio:

Sub UpdateSent(TheRow As Long)
'creo la connessione al DB Access
Dim conn As ADODB.Connection
   Dim NumOfRec As Integer
   Dim strPath As String
strPath = ActiveDocument.Path & "\stampaunione.mdb"
   

   Set conn = New ADODB.Connection

   conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath

   conn.Execute "UPDATE Aziende_Ricevuta SET sent =  1" & _
      " WHERE Id = " & TheRow, NumOfRec, adExecuteNoRecords

   
   conn.Close
   Set conn = Nothing
End Sub

E, per quanto riguarda la macro vera e propria:

Sub Stampa_PDF()
 
    Dim fd As FileDialog
    'Crea un oggetto FileDialog per scegliere la cartella in cui salvare i file
    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
ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord
'Quanti record ci sono?
hmrecords = ActiveDocument.MailMerge.DataSource.ActiveRecord
'posizionati sul primo record
ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord
    For i = 1 To hmrecords + 1
      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
              docName = .DataFields("anno").Value & "_" & .DataFields("Modulo").Value & "_" & .DataFields("Broker").Value & "_" & .DataFields("Cognome").Value & "_" & .DataFields("Numero").Value & ".pdf"
              TheRow = .DataFields("ID").Value
              sent = .DataFields("sent").Value
              
'se il record è flaggato salta la stampa

              If sent = 1 Then GoTo 100
            End With
        .Execute Pause:=False
        Application.ScreenUpdating = False
     End With
'crea il PDF
        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
'vai alla sub che flagga a "vero" il record appena processato
        UpdateSent (TheRow)
100    'se la riga non va stampata salta qui
   Next i
Application.ScreenUpdating = True
End Sub

il tutorial attuale (3): [mx_youtuber type="video" id="5n5NuF9LCN0"]

I due tutorial precedenti. qui il primo (1): [mx_youtuber type="video" id="izlQ9osMfz4"]

Il secondo (2): [mx_youtuber type="video" id="uYugLf4vv7U"]

STAMPA UNIONE: INVIO PDF VIA EMAIL (oppure no :D)

pdf send

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

VBA: INVIO PDF IN EMAIL – INSERIRE FIRMA OUTLOOK E INVIARE CC

pdf send

Mi riferisco ad un articolo "stampa unione"  in cui spiegavo come risolvere il problema della stampa unione (Word-Excel) per l’invio di un allegato PDF. Il sistema invia tramite Outlook (che dovrà già essere configurato opportunamente).

Qualcuno mi ha chiesto se è possibile inviare, per ogni singola email effettuata in stampa unione, le medesime email in CC (Carbon Copy, “per conoscenza”). Una seconda domanda riguardava invece la possibilità di inserire, nel testo della email (che nel codice originario si limitava ad un semplice testo ASCII senza formattazione) la firma di default.

Per chi non lo sapesse, Outlook prevede, come tutti i client di posta elettronica, la possibilità di creare una o più firme da inserire, automaticamente o meno, in calce al testo della email.

Analizziamo un problema per volta.

Il primo, molto semplice, consiste nell’aggiungere al codice esistente:

‘imposto l’indirizzo Carbon Copy
item.CC = “This email address is being protected from spambots. You need JavaScript enabled to view it.”;

appena dopo la riga

item.To = EmailAddress

che trovate verso la fine della subroutine.

Ovviamente, nel caso di più indirizzi, è sufficiente inserire tra i doppi apici il set di indirizzi separati da punto e virgola (“This email address is being protected from spambots. You need JavaScript enabled to view it.;This email address is being protected from spambots. You need JavaScript enabled to view it.;This email address is being protected from spambots. You need JavaScript enabled to view it.”).

Quanto al secondo problema, quello della firma, non ho buone notizie per ora. Da ciò che ho letto, il problema principale sta nel fatto che gli oggetti firma NON sono direttamente accessibili da VBA. Questo ci impone di trovare una soluzione “workaround”, una sorta di escamotage. Quello che penso sia il più efficiente consiste in questo stratagemma:

  • preparo in Outlook un nuovo messaggio, completo di tutto ciò che è necessario inviare ad esclusione dell’allegato.
  • Invece di inviare il messaggio a qualcuno, salvo il messaggio in HTML:

(finestra del nuovo messaggio) File->salva con nome

avendo cura di selezionare, nella combo box “salva come” in basso, il formato HTML. Avrò già deciso DOVE collocare il file, ad esempio in

c:\temp

e assegno come nome del file

htmlmessage

senza aggiungere estensione.

In pratica, a questo punto, avremo un file chiamato htmlmessage.html in c:\temp

Questo file, preziosissimo, contiene tutto il necessario per messaggio, firma ed eventuali elementi grafici. Non resta che importare questo file nel codice VBA assegnandolo ad una variabile stringa che nel mio esempio ho denominato MyHTMLMessage.

Nel codice, ho sostituito il metodo item.body con item.HTMLBody, che supporta, come è facile intuire, il codice HTML

Spero al più presto di realizzare un tutorial ad hoc. Nel frattempo pubblico il codice con le modifiche di cui vi ho parlato sin qui:

Sub Unione_in_pdf()
‘dimensionamento per Body in HTML
Dim strFilename As String: strFilename = “C:\temp\htmlmessage.txt”
Dim MyHTMLMessage As String
Dim iFile As Integer: iFile = FreeFile

‘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)
‘carica il messaggio HTML
Open strFilename For Input As #iFile
MyHTMLMessage = Input(LOF(iFile), iFile)
Close #iFile
‘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

‘instanzio 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 l’indirizzo Carbon Copy
item.CC = “This email address is being protected from spambots. You need JavaScript enabled to view it.”;
‘imposto il corpo HTML del messaggio
item.HTMLBody = MyHTMLMessage
‘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