Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel] invio mail

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[Excel] invio mail

Postdi dreamtime » 20/02/14 20:06

Ciao a tutti!
devo far partire delle email da un foglio excel, utilizzando Outlook 2010. Ho cercato sul forum :idea: e ho trovato tantissimi esempi dai quali prendere spunto. Per iniziare ho scelto questo sotto:

Codice: Seleziona tutto
Sub InviaAll()
For I = 2 To Cells(Rows.Count, "A").End(xlUp).Row
    Range("G1") = I
    Call Invioemail
Next I
End Sub

Sub Invioemail()
Dim OutApp As Object
Dim OutMail As Object
Dim EmailAddr As String
Dim Subj As String
Dim BodyText As String
Const LF = vbCrLf
'  (a)
Set OutApp = CreateObject("Outlook.Application")
''compilazione del testo di accompagnamento
For I = 2 To Range("X100").End(xlUp).Row
    BDT = BDT & Cells(I, "X").Value & LF
Next I

''  (b)
Nominat = Cells(Range("G1").Value, "A").Value
EmailAddr = Cells(Range("G1").Value, "G").Value
Subj = Range("X1").Value
'
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = EmailAddr
.CC = "alfa@gmail.com"     '<<< Destinatario fisso in c.c.
.BCC = ""
.Subject = Subj
'.Attachments.Add OutFile
.Body = BDT
.Display 'or use .send
'.send
End With

'  (c)
Set OutMail = Nothing
'
'  (d)
Set OutApp = Nothing

    Application.Wait (Now + TimeValue("0:00:02"))
    Application.SendKeys "%a"
    Application.Wait (Now + TimeValue("0:00:04"))
'

End Sub


ma sto trovando tante difficolta' nel preparare il messaggio di testo, perche' non sono molto brava con le macro :oops: : nell'esempio di macro proposta il corpo del testo (BDT) e' preso "in verticale" mentre io devo comporlo con parti fisse - tipo "label:" + parti variabili prese dalle celle del foglio e io non so come fare a "comporre" questo tipo di testo. Il tipo di mail che devo inviare (si tratta di 3 tipi diversi di mail) dipende inoltre dal contenuto di una cella (colonna C) che puo' essere o meno valorizzata.
Dopo l'invio devo poi cancellare la cella in colonna C, ma posso farlo anche "a mano".

il testo che devo preparare e' tipo cosi':
caro utente..... (testo mail1)

campo1 : xxxx (contenuto cella di colonna H)
testo testo : xxxx (contenuto cella di colonna I)
campo3 : xxxx (contenuto cella di colonna J)
secondo testo : xxxx (contenuto cella di colonna K)
campo5 : xxxx (contenuto cella di colonna L)
campo6 : xxxx (contenuto cella di colonna M)

(testo chiusura mail 1)


Allego qui http://rapidshare.com/share/C25F6E1D7E8FF406332D71BEB5661095 un xls tipo quello che devo elaborare. Mi aiutate a capire come posso fare? :)
Grazie mille a tutti :!: :!: :!: :!: :!:
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Sponsor
 

Re: [Excel] invio mail

Postdi Anthony47 » 21/02/14 01:36

Da quello che vedo dovresti comporre il BDT con un loop del tipo
Codice: Seleziona tutto
For Each Cell in Range("H5").Offset(Range("G1").Value-1,0).Resize(1,6)
    BDT = BDT & Cell.Value & LF
Next Cell
Le parti fisse sono inserite prima del loop (parte iniziale) e a conclusione del loop (formula finale).

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] invio mail

Postdi dreamtime » 21/02/14 10:27

Grazie mille Anthony!! :)

dato che il testo delle mail e' e sara' stabile, ho pensato di gestirlo dentro la macro. Per comporre il .body della mail sto quindi preparando delle stringhe tipo

Codice: Seleziona tutto
.Body = "Questo messaggio è generato automaticamente." & vbCr & vbCr & "Le segnaliamo che e' ..." & vbCr & "Questo il codice:" & nomecampo & vbCr & vbCr & " altro pezzo messaggio...." 


Non e' che le so preparare :oops: ma ho copiato da un esempio di macro trovato sul forum....Pero' non so proprio come inserire il grassetto, l'italico e cambiare il colore del testo.... e' possibile farlo ? :)

Ancora grazie!!
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Re: [Excel] invio mail

Postdi dreamtime » 21/02/14 18:13

Ecco, stavolta ci sono riuscita, ho cambiato tutto e mi sembra che vada.... almeno mi pare! :)
Devo ancora mettere qualche controllo pero' mi sembra che funzioni :lol: .... posto la macro un po' "alleggerita" nel caso possa essere utile a qualcuno.

Praticamente la macro manda tre tipi diversi di mail, una per ogni riga del foglio excel, testando una cella per ogni riga e decidendo se la mail da inviare e' di un tipo oppure un altro e poi la invia. Ho dovuto accendere in Outlook la "Outlook object library", altrimenti non funzionava l'invio.

Mi resta da capire (e spero che qualcuno sia cosi' gentile da volermi aiutare... :oops: ) come mettere i bold e cambiare colore al testo del messaggio.... questo proprio non lo so fare.... qualcuno lo sa? Grazie comunque a tutti come sempre :!: :!: :!: :!:

Codice: Seleziona tutto
Sub InvioemailOutlook()
   
    Dim MyOlApp As Object
    Dim MyItem As Outlook.MailItem
    Dim AttachName As String
    Dim SendTo As String
    Dim Codice As String
    Dim Tipomail As String
    Dim Msg1 As String
    Dim Msg2 As String
    Dim Msg3 As String
    Dim Nome As String
    Dim Cognome As String
    Dim CCTo As String
    Dim E, F, G As Integer
    Dim Sys_Date As String
   
    F = Application.WorksheetFunction.CountA(Sheets("Sheet2").Range("A:A")) '''Sheet 2 e' il nome del foglio dove sono memorizzati i dati
   
   
For E = 2 To F

    Sheets("Sheet2").Select
    AttachName = Cells(E, 4).Value 'se c'e' file in attach qui diciamo il nome del file
    SendTo = Cells(E, 7).Value     'questa e' email di invio
    Codice = Cells(E, 4).Value     'questo e' il codice
    Tipomail = Cells(E, 3).Value   'questo e' il tipo di mail da inviare
    Nome = Cells(E, 6).Value       'colonna con nome utente
    Cognome = Cells(E, 5).Value    'colonna con cognome utente
    'CCTo = Cells(E, 7).Value      'se serve inviare in cc impostare la colonna x dove c'e' email cc oppure "mail@dominio.it"
    'CCTo = "mail@dominio.it"
   
    If Tipomail = "" Then GoTo nonelaboro
    End If
           
     If Tipomail = "invia" Then
    Msg1 = "testo messaggio1," & vbCr & vbCr & "lorem ipsum et etiam nomine deucet." & vbCr _
    & "lorem ipsum et etiam nomine deucet." & Cognome & " " & Nome & vbCr _
    & "lorem ipsum et etiam nomine deucet.numeribus: " & Codice & vbCr
           
        ElseIf Tipomail = "aggiorna" Then
        Msg2 = "testo messaggio2," & vbCr & vbCr & "lorem ipsum et etiam nomine deucet." & vbCr _
    & "lorem ipsum et etiam nomine deucet." & vbCr _
    & "lorem ipsum et etiam nomine deucet.numeribus: " & Codice & vbCr
   
            ElseIf Tipomail = "supero" Then
            Msg3 = "testo messaggio3" & vbCr & vbCr & "lorem ipsum et etiam nomine deucet." & vbCr _
    & "lorem ipsum et etiam nomine deucet." & vbCr _
    & "lorem ipsum et etiam nomine deucet numeribus: " & Codice & vbCr
                   
    Set MyOlApp = CreateObject("Outlook.Application")
    Set MyItem = MyOlApp.CreateItemFromTemplate("C:\Email.oft") 'inserire path e nome del modello otf di outlook
   
    MyItem.Display
   
    On Error Resume Next
    With MyItem
        .To = SendTo
        .CC = CCTo
        .BCC = ""
        .Subject = "Oggetto mail " & Codice
        ' se serve attach accendere riga
        '.Attachments.Add ("C:\" & AttachName & ".xlsx")
        If Tipomail = "invia" Then
        .Body = Msg1
            ElseIf Tipomail = "aggiorna" Then
            .Body = Msg2
                ElseIf Tipomail = "supero" Then
                .Body = Msg3
                End If
        .Display
        .Send
    End With
    On Error GoTo 0

    Set MyItem = Nothing
    Set MyOlApp = Nothing
   
   
nonelaboro:

Next E

End Sub
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Re: [Excel] invio mail

Postdi Anthony47 » 23/02/14 20:28

Mi era sfuggita la domanda " Mi resta da capire (e spero che qualcuno sia cosi' gentile da volermi aiutare...) come mettere i bold e cambiare colore al testo del messaggio"
Per questo pero' devi cambiare approccio e non inviare un semplice messaggio di testo ma un messaggio formattato html.
In linea di massima, puoi usare questa routine per compilare il messaggio html
Codice: Seleziona tutto
Function RangePublish(ByVal mySh As String, ByVal PRan As String) As Variant
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101351
'
Dim TmpFile As String, myBDT As String, PubFile
TmpFile = "C:\PROVA\" & "myBDT.htm"       'Vedi testo
'Crea file html:
With ThisWorkbook.PublishObjects.Add(SourceType:=xlSourceRange, _
    Filename:=TmpFile, _
    Sheet:=mySh, _
    Source:=PRan, _
    HtmlType:=xlHtmlStatic)
    .Publish (True)
End With
'
Set FSO = CreateObject("Scripting.FilesystemObject")
Set PubFile = FSO.OpenTextFile(TmpFile, 1, False)
  RangePublish = PubFile.ReadAll
PubFile.Close
'
End Function

La directory (C\PROVA, nell' esempio) deve gia' esistere, e in questa directory sara' creato un file myBDT.htm che poi sara' usato per popolare il testo html della mail.
Edit: Volendo si puo' lavorare nella directory Temp, sostituendo nel codice la riga TmpFile = "C:\PROVA\" & "myBDT.htm" con
TmpFile = Environ("Temp") & "\myBDT.htm"

Il codice e' da inserire in un modulo standard (va bene quello che gia'contiene la tua InvioemailOutlook) e va poi usato per compilare il testo html della mail, in sostituzione dei vari ".Body = MsgX".
Vedremo le modifiche alla macro piu' avanti.

Questo approccio presuppone infatti che da qualche parte sul tuo file tu abbia costruito il messaggio da inviare, completo di Preambolo e postambolo, con tutti i campi e le formattazioni che ti servono; quindi le modifiche sono sia al file di lavoro che alla macro.

Ad esempio (usando il file che hai pubblicato), in Foglio2 ho costruito nel range A3:B15 un ipotetico testo della email, come da immagine.
Immagine
upload immagini gratis
La cella A1 e' il numero di riga a cui il messaggio fa riferimento.
A3 e' calcolata con la formula
Codice: Seleziona tutto
="Caro utente " & SCARTO(Foglio1!$E$1;A1-1;1)&" "&SCARTO(Foglio1!$E$1;A1-1;0)

A4 contiene invece
Codice: Seleziona tutto
 ="Ti inviamo il riepilogo di quel che sai alla data di "&TESTO(OGGI();"gg-mmm-aaaa")

Da A5 verso il basso ci sono i nomi dei campi da inserire nel messaggio; il valore di Campo1 lo calcoli in B5 con la formula
Codice: Seleziona tutto
=SCARTO(Foglio1!H$1;$A$1-1;0)

Analoghe formule userai per gli altri campi, usando sempre "$A$1-1" come scarto di righe.
Se i campi da inserire nel messaggio fossero contigui nel foglio di origine allora potresti usare in B5 la formula =SCARTO(Foglio1!H$1;$A$1-1;RIF.RIGA(A1)-1) che poi puoi copiare verso il basso per ottenere il valore degli altri campi adiacenti.

Sempre usando A1 come "offset" compilerai in altre aree di Foglio2 gli altri potenziali messaggi (che poi saranno scelti in funzione di "tipomail").

Tieni presente che il testo leggibile sara' solo quello compreso nei margini dell' intervallo che userai quando richiami la Function RangePublish; quindi nell' immagine di sopra il testo di riga 3, 4, 12 potrebbe essere troncato; per evitare questo rischio usa eventualmente "Unisci celle" per allargare le celle contenente testo lungo (come ho fatto io). Puoi vedere il testo prodotto aprendo col tuo browser il file C:\PROVA\myBDT.htm


La macro dovra' quindi compilare A1 di Foglio2 e inserire il giusto testo del messaggio nella email; vediamo le modifiche, che riguardano 3 aree all' interno del ciclo For E = 2 To F /Next E.

1) Subito dopo la riga For E = 2 To F inserisci
Codice: Seleziona tutto
Sheets("Foglio2").Range("A1").Value=E

Questo consente di compilare i vari messaggi con i campi appartenenti ai singoli utenti.

2) Modificheremo invece da If Tipomail = "invia" Then (incluso) a Set MyOlApp = CreateObject("Outlook.Application") (escluso; la riga quindi rimane).
Supponiamo che su Foglio2, in A3:B15 hai "compilato" il messaggio per tipomail="invia"; in J3:K20 invece il messaggio per tipomail="Aggiorna" e in Q3:R10 il messaggio per tipomail="supero".
Allora compilerai il messaggio "giusto" con le istruzioni
Codice: Seleziona tutto
If Tipomail = "invia" Then myMess = RangePublish("Foglio2", "A3:B15")
If Tipomail = "aggiorna" Then myMess = RangePublish("Foglio2", " J3:K20")
If Tipomail = "supero" Then myMess = RangePublish("Foglio2", "Q3:R10")


3) infine infilerai il messaggio (sempre myMess, che ha un contenuto diverso a seconda di "tipomail"):
Per questo sostituirai tutto il ciclo
If Tipomail = "invia" Then
.Body = Msg1
ElseIf Tipomail = "aggiorna" Then
.Body = Msg2
ElseIf Tipomail = "supero" Then
.Body = Msg3
End If

Con
Codice: Seleziona tutto
        . HTMLBody = myMess


That's all, anche perche' mi cominciavo a stufare dell' argomento :D :D

Guardando la tua macro mi pare che la struttura dei tuoi dati siano diversi da quanto hai pubblicato, spero comunque che i concetti espressi sopra siano facilmente adattabili alla reale struttura.

Fai sapere come finisce...
Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] invio mail

Postdi dreamtime » 13/03/14 19:34

Grazie Anthony, ci ho messo parecchio per capire perche' per me questo invio in html e' stato un lavoraccio (e' stato un po' difficile per le mie scarse capacita' in excel) Pero' dopo molto lavoro (o meglio ... molti "tentativi" :D sono finalmente riuscita a produrre delle mail come volevo io!!!! WOW! :lol: :lol:

Grazie tantissime per la pazienza e per tutti i suggerimenti, ho imparato tante cose!!!!!. :) :) :) :) :)
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Re: [Excel] invio mail

Postdi Marco75CT » 13/09/16 11:09

Ciao,
vorrei sapere se è possibile allineare il corpo dell'email a sinistra.
Grazie
Marco75CT
Utente Senior
 
Post: 143
Iscritto il: 05/08/11 11:54

Re: [Excel] invio mail

Postdi Anthony47 » 14/09/16 14:59

Immagino che usi la RangePublish per creare il testo html del messaggio; in linea di massima, devi inserire l'attibuto Align sulle tables create; probabilmente questo lo puoi fare con questa Replace:
Codice: Seleziona tutto
mymess = Replace(RangePublish("Foglio1", "L1:O10"), "<table", "<table align=left ", , , vbTextCompare)


Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] invio mail":


Chi c’è in linea

Visitano il forum: Anthony47 e 22 ospiti