Macro per invio di molte mail, ognuna con allegato differente

Anonimo
2017-12-19T15:23:52+00:00

Ciao a tutti,

innanzitutto mi scuso se posto questa richiesta in quanto so che è stata trattata su diversi forum ed in forme differenti.

Da neofita ed ignorante in materia, ho provato a interpretare più di una macro trovata nella rete e utilizzata a questo scopo, cercando di adattarla alle mie esigenze, ma non sono riuscito ad arrivare ad un risultato positivo.

Chiedo una mano a chi si sente di potermela dare.

Ho Outlook 2016 ed il foglio che ho creato è molto semplice:

  • Colonna A: indirizzo mail
  • Colonna B: Cognome
  • Colonna C: Nome
  • Colonna D: Sig. (o Sig.ra)
  • Colonna E: Percorso allegato
  • Colonna F: Nome allegato.PDF

I record partono dalla riga 2 e sono 360

Quello che vorrei ottenere è una mail per ogni indirizzo, che abbia un testo simile:

Buongiorno sig. "Cognome",

assaadfafl dlfj slk flsdkj ò sal as pofòlsa pap òak

Cordiali saluti

In questa posizione vorrei anche inserire la firma composta da un'immagine e più righe di testo.

A questo testo, uguale per tutti, tranne il "Cognome", dovrei allegare il file corrispondente (percorso e nome file sono nella colonna E ed F alla riga corrispondente al Cognome).

C'è qualcuno che ha qualcosa di già fatto così da non rubargli troppo tempo?

Ringrazio chiunque riesca ad aiutarmi

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

17 risposte

Ordina per: Più utili
  1. Anonimo
    2017-12-21T16:25:14+00:00

    Ciao Bigigio,

    ho apportato solo un paio di modifiche (una sugli indirizzi di destinazione, in quanto andava a prendere sempre solo il primo indirizzo mail, mentre a me serve inviare a indirizzi differenti, per cui ho variato da  sIndirizzo = arrIn(1, 1) a  sIndirizzo = arrIn(i, 1), spero sia corretto...)

    Certo! arrIn(1,1) avrebbe dovuto essere arrIn(i,1) - si trattava di un refuso!

    soprattutto riguardanti il testo della mail.

    Ovvianmente i testo e' facoltativo e il mio test era solo un semoio del modo da impostarlo.

    A questo proposito, spero che tu abbia anche modificato il testo della costante sOggetto ! :-))

    Funziona tutto perfettamente.

    Bene! Mi fa piacere.

    Per chiudere questo thread, vorrei chiederti gentilmente di contrassegnare la mia risposta come Risposta. In questo modo, tu aiuterai anche coloro  che potessero cercare soluzioni ai problemi simili negli archivi della Community.

    Ti ringrazio molto per la preziosissima collaborazione e ti auguro un sereno Natale

    Ricambio molto cordialmente gli auguri.

    Alla prossima.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    7 persone hanno trovato utile questa risposta.
    0 commenti Nessun commento
  2. Anonimo
    2017-12-19T22:26:00+00:00

    Ciao Bigigio,

    innanzitutto mi scuso se posto questa richiesta in quanto so che è stata trattata su diversi forum ed in forme differenti.

    Da neofita ed ignorante in materia, ho provato a interpretare più di una macro trovata nella rete e utilizzata a questo scopo, cercando di adattarla alle mie esigenze, ma non sono riuscito ad arrivare ad un risultato positivo.

    Chiedo una mano a chi si sente di potermela dare.

    Ho Outlook 2016 ed il foglio che ho creato è molto semplice:

    • Colonna A: indirizzo mail
    • Colonna B: Cognome
    • Colonna C: Nome
    • Colonna D: Sig. (o Sig.ra)
    • Colonna E: Percorso allegato
    • Colonna F: Nome allegato.PDF

    I record partono dalla riga 2 e sono 360

    Quello che vorrei ottenere è una mail per ogni indirizzo, che abbia un testo simile:

    Buongiorno sig. "Cognome",

    assaadfafl dlfj slk flsdkj ò sal as pofòlsa pap òak

    Cordiali saluti

    In questa posizione vorrei anche inserire la firma composta da un'immagine e più righe di testo.

    A questo testo, uguale per tutti, tranne il "Cognome", dovrei allegare il file corrispondente (percorso e nome file sono nella colonna E ed F alla riga corrispondente al Cognome).

    Prova qualcosa del genere:

    • Alt+F11 per aprire l'editor di VBA
    • Alt+IMper inserire un nuovo modulo di codice
    • Nel nuovo modulo vuoto, incolla il seguente codice:

    '=========>>

    Option Explicit

    '--------->>

    Public Sub Tester()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim Rng As Range

        Dim arrIn As Variant

        Dim oOutlook As Object

        Dim oMail As Object

        Dim sIndirizzo As String

        Dim sNome As String

        Dim sCognome As String

        Dim sTitolo As String

        Dim sPercorso As String

        Dim sAllegato As String

        Dim LRow As Long, i As Long

        Const sFoglio As String = "Foglio1"                             '<<=== Modifica

        Const sOggetto As String = "Vote for Trump"          '<<=== Modifica

        Const sSalutazione As String = "Buon giorno "          '<<=== Modifica

        Set WB = ThisWorkbook

        Set SH = WB.Sheets(sFoglio)

        With SH

            LRow = LastRow(SH, .Columns("A:A"))

            Set Rng = .Range("A2:F" & LRow)

        End With

        arrIn = Rng.Value2

        Set oOutlook = CreateObject("Outlook.Application")

        For i = 1 To UBound(arrIn)

            Set oMail = oOutlook.CreateItem(0)

            With oMail

                sIndirizzo = arrIn(1, 1)

                sCognome = arrIn(i, 2)

                sNome = arrIn(i, 3)

                sTitolo = arrIn(i, 4)

                sPercorso = arrIn(i, 5)

                sAllegato = arrIn(i, 6)

                .To = sIndirizzo

                .CC = ""

                .BCC = ""

                .Subject = sOggetto

                .Body = sSalutazione & sTitolo & Space(1) _

                        & sNome & Space(1) & sCognome _

                        & vbNewLine & vbNewLine _

                        & "Alleghiamo il file " & sAllegato

                .Attachments.Add sPercorso _

                                 & Application.PathSeparator _

                                 & sAllegato

                .Send

            End With

            Set oMail = Nothing

        Next i

        Set oMail = Nothing

        Set oOutlook = Nothing

    End Sub

    '--------->>

    Public Function LastRow(SH As Worksheet, _

                            Optional Rng As Range, _

                            Optional minRow As Long = 1, _

                            Optional sPassword As String)

        Dim bProtected As Boolean

        With SH

            If Rng Is Nothing Then

                Set Rng = .Cells

            End If

            bProtected = .ProtectContents = True

            If bProtected Then

                Application.ScreenUpdating = False

                .Unprotect Password:=sPassword

            End If

        End With

        On Error Resume Next

        LastRow = Rng.Find(What:="*", _

                           after:=Rng.Cells(1), _

                           Lookat:=xlPart, _

                           LookIn:=xlFormulas, _

                           SearchOrder:=xlByRows, _

                           SearchDirection:=xlPrevious, _

                           MatchCase:=False).Row

        On Error GoTo 0

        If LastRow < minRow Then

            LastRow = minRow

        End If

        If bProtected Then

            SH.Protect Password:=sPassword, _

                       UserInterfaceOnly:=True

        End If

        Application.ScreenUpdating = True

    End Function

    '<<=========

    • Alt+Q per chiudere l'editor di VBA e tornare a Excel
    • Salva il file con l’estensione xlsm
    • Alt+F8 per aprire  la finestra di gestione delle macro
    • Seleziona Tester
    • Esegui

    ===

    Regards,

    Norman

    La risposta è stata utile?

    4 persone hanno trovato utile questa risposta.
    0 commenti Nessun commento
  3. Anonimo
    2018-05-08T18:04:47+00:00

    Ciao Bigigio,

    Grazie mille Norman, funziona tutto alla perfezione.

    Giusto per curiosità, ma a cosa serve e cosa significa l'istruzione che hai inserito:

    Const sEmailContatto As String =  _

                                 "abcCHIOCCIOLAdef.com"         '<<=== Modifica

    Se io avessi scritto abc @ def.com, senza gli spazi prima e dopo il simbolo @, il software della Community avrebbe sostituito l'indirizzo email con *** L'indirizzo di posta elettronica viene rimosso per motivi di privacy ***. Quindi ho sostituito il symbolo @ con la parola CHIOCCIOLA.

    Tutto qui ...  ;-)

    ===

    Regards,

    Norman

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  4. Anonimo
    2018-03-20T16:10:42+00:00

    Ciao Norman e grazie.

    In pratica questa parte:

    Per ottenere la firma predefinita al fondo della email sarebbe necessario:

    • Creare una firma (con una immagine o meno) in Outlook, così creando tre file con le estensioni HTM, TXT and RTFnella cartella C:\Users\Casanmaner\AppData\Roaming\Microsoft\Signatures
    • Utilizza codice del genere:

          Set oMail = oOutlook.CreateItem(0)

          With oMail

              .Display

               .To = "*** L'indirizzo di posta elettronica viene rimosso per motivi di privacy ***"

               .CC = "*** L'indirizzo di posta elettronica viene rimosso per motivi di privacy ***"

               .BCC = ""

               .Subject = "Collusione"

               .HTMLBody = sBody & "<br>" & .HTMLBody

            .Send

        End With

    è quanto già faccio.

    La differenza è solo nel fatto che non utilizzo l'HTMLBody ma Body.

    Studierò un po' il bravo Ron de Bruin per vedere la parte dell'inserimento da file.

    Grazie ancora

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  5. Anonimo
    2017-12-21T14:17:44+00:00

    Gentilissimo Norman,

    ho apportato solo un paio di modifiche (una sugli indirizzi di destinazione, in quanto andava a prendere sempre solo il primo indirizzo mail, mentre a me serve inviare a indirizzi differenti, per cui ho variato da  sIndirizzo = arrIn(1, 1) a  sIndirizzo = arrIn(i, 1), spero sia corretto...) soprattutto riguardanti il testo della mail.

    Funziona tutto perfettamente.

    Ti ringrazio molto per la preziosissima collaborazione e ti auguro un sereno Natale

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento