Tutorial Inviare mail con Excel inserendo una tabella nel corpo del testo di Outlook

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
18.123
736
113
Como
2011MAC 2016WIN
316
Vediamo un metodo per inviare e-mail con Outlook inserendo nel corpo del messaggio un intervallo o una tabella di Excel

Per fare ciò mi sono avvalso del codice Htlm molto più flessibile per gestire il testo all'interno del corpo della mail

Prima di tutto riporto le espressioni e i tag che ho usato in HTLM

Come prima cosa ho usato queste due espressioni:

"<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd' >" si tratta del doctype
"<html xmlns='http://www.w3.org/1999/xhtml'>"

La prima riga di codice è sempre quella che apre un documento HTML e serve per indicare al browser il tipo di documento di cui si tratta, mentre la seconda identifica i nomi dei tag e degli attributi che puoi usare all'interno del documento xml

I TAG:

<body> inizia il corpo del testo che sarà inserito in Outlook (si chiude con </body>)

<p> crea un nuovo paragrafo (si chiude con </p>)

<br> va a capo (si chiude con </br>)

<table> identifica la tabella (si chiude con </table>)

<tr> identifica le righe (si chiude con </tr>)

<td> identifica le celle (si chiude con </td>)

<font color='blue'>" imposta come colore del font blu (si chiude con </font>)

<strong> imposta il font in grassetto (si chiude con </strong>)

<span style='font-size:16px'> dimensiona il font a 16px (si chiude con </span>)

Veniamo al codice

Mi servono due variabili oggetto per gestire Outlook
Codice:
Dim OutApp As Object
Dim OutMail As Object

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
Poi mi servono altre variabili, due per i cicli For per ciclare righe e colonne, una per trovare l'ultima riga
Codice:
 Dim i As Long
Dim j As Integer
Dim uR As Long
Mi servono ancora due variabili per il testo delle mail
Codice:
Dim StrMail As String
Dim StrDest As String
A questo punto inizio a scrivere usando il codice Htlm, dopo pe prime due righe spiegate sopra inizio ad aprire il coprop del testo con <body>
Codice:
StrMsg = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd' >"
StrMsg = StrMsg & "<html xmlns='http://www.w3.org/1999/xhtml'>"
StrMsg = StrMsg & "<body>"
Inserisco il rpimo paragrafo, mettendo una frase di fantasia "Gentilissimi signori"
Codice:
StrMsg = StrMsg & "<p> Gentilissimi Signori,"
Con <br> vado a capo e chiudo il paragrafo
Codice:
 StrMsg = StrMsg & "<br /><br /> vi inolro i dati anagrafici dei nostri clienti </p>"
Uso il TAG <table> per creare una tabella e imposto le dimensioni
Codice:
StrMsg = StrMsg & "<table width='800' border= '1' cellpadding='0'>"
Uso il tag per le righe <tr> (table row)
Codice:
StrMsg = StrMsg & "<tr>"
A questo punto mi sevo dei cicli per creare la tabella che metterò nel corpo del testo della mail
Codice:
uR = Foglio1.Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To uR
        For j = 1 To 4
            If i = 1 Then
                StrMsg = StrMsg & _
                    "<td><p aling='center'>" & _
                    "<font color='blue'>" & _
                    "<strong>" & _
                    "<span style='font-size:16px'>" & _
                    Foglio1.Cells(i, j) & _
                    "</font> </strong> </p></td> </span>"
            Else
                StrMsg = StrMsg & "<td><p aling='center'>" & Foglio1.Cells(i, j) & "</p></td>"
            End If
            StrMail = StrMsg
        Next
        StrMsg = StrMsg & "</tr>"
    Next
La condizione IF mi serve per formattare diversamente la prima riga della tabella contenente le intestazioni
Se i è uguale a 1, cioè se è la prima riga che nel mio caso contiene le intestazioni allora la formatto come di seguito:
Codice:
 If i = 1 Then
                StrMsg = StrMsg & _
                    "<td><p aling='center'>" & _
                    "<font color='blue'>" & _
                    "<strong>" & _
                    "<span style='font-size:16px'>" & _
                    Foglio1.Cells(i, j) & _
                    "</font> </strong> </p></td> </span>"
Altrimenti, copio solo i dati nella tabella senza la formattazione della prima riga
Codice:
  Else
      StrMsg = StrMsg & "<td><p aling='center'>" & Foglio1.Cells(i, j) & "</p></td>"
  End If
Chiudo il paragrafo e quindi la tabella
Codice:
StrMsg = StrMsg & "</tr>"
    Next
    StrMsg = StrMail & "</table>"
Apro un nuovo paragrafo per inserire una frase finale
Codice:
  StrMsg = StrMsg & "<br> Cordiali saluti. </br>"
Chiudo il corpo del testo e chiudo il codice htlm
Codice:
StrMsg = StrMsg & "</body>"
StrMsg = StrMsg & "</htlm>"
A questo punto posso inviare la mail (ho lasciato .Dispaly attivo e .Send commentato, se si vuole inviare la mail realmente senza vedere Outlok si può fare al contrario)
Codice:
StrDest = "mymail@mymail.com"
    With OutMail
        .To = StrDest
        .CC = ""
        .BCC = ""
        .Subject = "Invio nominativi"
        .HTMLBody = StrMsg
        .Display
        '.Send 
    End With
Il codice completo è questo:
Codice:
Sub invia_mail_tabella_Excel()
'by Ges - www.ForumExcel.it
    Dim OutApp As Object
    Dim OutMail As Object
    Dim StrMsg As String
    Dim StrMail As String
    Dim StrDest As String
    Dim uR As Long
    Dim i As Long
    Dim j As Integer
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
    StrMsg = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd' >"
    StrMsg = StrMsg & "<html xmlns='http://www.w3.org/1999/xhtml'>"
    StrMsg = StrMsg & "<body>"
    StrMsg = StrMsg & "<p> Gentilissimi Signori,"
    StrMsg = StrMsg & "<br /><br /> vi inolro i dati anagrafici dei nostri clienti </p>"
    StrMsg = StrMsg & "<table width='800' border= '1' cellpadding='0'>"
    StrMsg = StrMsg & "<tr>"
    uR = Foglio1.Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To uR
        For j = 1 To 4
            If i = 1 Then
                StrMsg = StrMsg & _
                    "<td><p aling='center'>" & _
                    "<font color='blue'>" & _
                    "<strong>" & _
                    "<span style='font-size:16px'>" & _
                    Foglio1.Cells(i, j) & _
                    "</font> </strong> </p></td> </span>"
            Else
                StrMsg = StrMsg & "<td><p aling='center'>" & Foglio1.Cells(i, j) & "</p></td>"
            End If
            StrMail = StrMsg
        Next
        StrMsg = StrMsg & "</tr>"
    Next
    StrMsg = StrMail & "</table>"
    StrMsg = StrMsg & "<br> Cordiali saluti. </br>"
    StrMsg = StrMsg & "</body>"
    StrMsg = StrMsg & "</htlm>"
    StrDest = "mymail@mymail.com"
    With OutMail
        .To = StrDest
        .CC = ""
        .BCC = ""
        .Subject = "Invio nominativi"
        .HTMLBody = StrMsg
        .Display
        '.Send
    End With
    Set OutApp = Nothing
    Set OutMail = Nothing
End Sub

Allego file di esempio.
 

Allegati

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
5.386
187
63
75
Catania
Excel2010
116
Salve
Il Boss non smette mai di stupirci con le sue diavolerie. :devilish:
Complimenti MiInchino PollicioneInSu :StrettaDiMano:

Se mi è consentito un piccolo suggerimento. Molti oggi utilizzano Mozilla-Thunderbird
Come fare per utilizzare quanto fatto da ges @ges col nuovo strumento? Si può utilizzare così come è (credo di no)?
Quali sono i "punti" da cambiare?.

Grazie. Ancora complimenti,
Mario
 

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
18.123
736
113
Como
2011MAC 2016WIN
316
Ciao Mario, grazie per i complinenti.
Per Mozilla-Thunderbird bisogna interagire con l'applicazione usando il percorso e poi il corpo.
Codice:
...
InviaMail = "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe"
Shell InviaMail & StrMsg, vbNormalFocus
.......
Purtoppo però non lo uso quindi non posso provare il codice, se non lo farà qualcun altro, mi riservo più avanti di scaricarlo, installarlo e dedicarmi anche a questo progetto.
 

Powerwin

VBA Expert
Expert
17 Marzo 2016
3.484
139
63
Milano
2016/365
42
Piccolissima correzione sul codice per Thunderbird

C-like:
InviaMail = "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe"
dati = " -compose " & "to=" & Strdest & "," & "subject="Invio nominativi"," & "body=" & StrMsg

Shell InviaMail & dati, vbNormalFocus
Inviato dal mio S6
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!