Allora cominciamo con l'analizzare e correggere il codice che hai fatto:
Dove tu hai Scritto:
Dim NewMail As Object
Set NewMail = CreateObject("Outlook.Application").CreateItem(oMailItem)
Io Scriverei:
Dim OutApp As Object
Dim NewMail As Object
Set OutApp = CreateObject("Outlook.Application")
Set NewMail = OutApp.CreateItem(oMailItem)
Infatti credo sia meglio gestire separatamente gli oggetti istanziati... ma non avevi fatto comunque un errore…
Nota tecnica:
Normalmente quando si scrive codice di automazione si inizia con l'Early Binding ed infine si termina con il Late Binding… ho notato che hai scritto direttamente in Late Binding (il primo ti permette di sfruttare l'intellisense ma richiede l'inserimento dei riferimenti - il secondo non espone l'intellisense ma non necessita dei riferimenti)… se non sai cosa sono Early Binding, LAte Binding e intellisense puoi cercarli su google se ti va… non è strettamente necessario alla risoluzione del tuo problema).
Poi proseguivi con:
With NewMail
.To = Worksheets("il mio foglio excel che si chiama Orders").Range("qui non so cosa mettere")
.Subject = "Invio di prova"
.Body = "qui dovrebbe apparire come corpo del messaggio le celle corrispondenti alla cella con valore 0 quando essa cambia"
Destin = "a.pippo@dominio.it"
ActiveWorkbook.SendMail Recipients:=Destin, Subject:="Ciao"
.Send
End With
che tutto sommato potrebbe andare bene ma
"ActiveWorkbook.SendMail Recipients:=Destin, Subject:="Ciao"" e
Destin = "" non c'entrano nulla quindi:
With NewMail
.Display
.To = ""
.CC = ""
.Subject = "OGGETTO DELLA MAIL"
.HTMLBody = "Corpo della mail" 'CreaCorpoEmail()
.Display
'.Send
End With
In particolare:
.To = conterrà il valore delle celle G1 e G2 del foglio excel che mi hai indicato separate dal punto e vergola se inseriti entrambi. Sai come prelevare il valore di una cella da Excel? (Suggerimnto: in maniera molto simile a come avevi scritto tu nel tuo codice iniziale ma devi accedere alla proprietà "value" ovvero Worksheets("Orders").Range("G1").value & "; " & Worksheets("Orders").Range("G2").value (quindi con un semplice if else puoi disciplinare la presenza di 1 o 2 indirizzi destinatario;
.CC = sarebbe il classico "destinatario per conoscenza" se non ti serve levalo;
.HTMLBody l'ho sostituito a .Body perché per quello che vuoi fare credo sia più indicato un corpo HTML al posto di quello classico con solo testo. Inoltre dopo "Corpo della mail" ho aggiunto un commento "'CreaCorpoMail" che in realtà poi andrà immediatamente dopo il segno di uguale ad indicare che servirà una funzione che legga le righe del file Excel, le trasformi in codice HTML e il risultato ottenuto lo mette nel HTMLBody.
.Display=Ti serve per vedere come viene la mail prima di essere trasmessa... quando avrai appurato che il format ottenuto ti soddisfa potrai cancellarlo
.Send l'ho flaggato perché ovviamente per ora la mail non deve essere trasmessa ma solo controllata a video per verificare che sia tutto esatto... quando tutto sarà finito potrai deflaggarla.
Infine consa che non avevi fatto concluderei con un bel:
Set OutApp = Nothing
Set NewMail = Nothing
che serve per liberare la memoria inizialmente allocata per ospitare gli oggetti creati a inizio codice.
Non ho fatto nient'altro che modificare e correggere quello che hai fatto tu spiegandoti cosa secondo me andava rivisitato…
Come ti avevo anticipato per creare il codice HTML da inserire in HTMLBody serve altro codice che per chiarezza ho preferito gestire separatamente in un'altra funzione:
Function CreaCorpoEmail() As String
Dim strbody As String
Dim i As Integer
strbody = strbody & "<html>"
strbody = strbody & "<b>TITOLO EMAIL</b><br>"
strbody = strbody & "<p><b><font color='red'>TESTO DI COLORE ROSSO</font></b></p>"
strbody = strbody & "<body>"
strbody = strbody & "<table border='1'>"
strbody = strbody & "<tr>"
strbody = strbody & "<td>INTESTAZIONE1</td><td>INTESTAZIONE2</td><td>INTESTAZIONE3</td><td>INTESTAZIONE4</td>"
strbody = strbody & "</tr>"
For i = 0 To 19
strbody = strbody & "<tr>"
strbody = strbody & "<td>CELLA1</td><td>CELLA2</td><td>CELLA3</td><td>CELLA4</td>"
strbody = strbody & "</tr>"
Next
strbody = strbody & "</table>"
strbody = strbody & "</body>"
strbody = strbody & "</html>"
CreaCorpoEmail = strbody
End Function
Se conosci un po di sintassi HTML non dovresti avere difficoltà ad interpretare il codice HTML memorizzato nella stringa strbody... si tratta di una pagina HTML semplice con una tabella di 21 righe e 4 colonne (la prima è l'intestazione).. ovviamente è solo per farti vedere cosa esce… ora rimane da prelevare il contenuto dal foglio Excel così da riempire la tabella con i dati reali…
Se hai notato sto cercando di evitare il codice pronto da copia e incolla perché mi piace l'idea di trasmettere qualcosa a chi chiede aiuto.
Prova a mettere insieme il tutto così da darmi conferma che vedi effettivamente apparire la mail con le 21 righe di codice HTML senza ricevere errori.. e se riesci potresti anche provare a prelevare qualcosa dal foglio Excel per sostituirlo al testo (cominciando dall'intestazione ad esempio)...