Invio automatico e-mail promemoria excel 2019

Anonimo
2024-09-19T13:58:12+00:00

Buongiorno, sto cercando la soluzione al mio problema, ma non ho trovato quella giusta. Il problema è questo:

Ho un file excel con un elenco di persone e le scadenze loro scadenze (ad esempio documento, corso. Ecc...).

Attualmente, il mio alert è la formattazione condizionale, con la quale mi compare una "X" e la cella rossa se scaduto oppure cella vuota in verde se in corso di validità.

Vorrei sapere come fare in modo che excel, prima della scadenza, invii una mail di promemoria per il rinnovo alla persona che ha la scadenza prossima, (chiaramente solo alle persone che stanno per scadere e non alle altre).

Esempio:

       A.                        B.                C.                 D

1 Nome e cognome mail. Scadenza. Alert

2 Tizio sempronio. Xxxxx. 01/09/24. X

3 Caio morello. Xxxxxx. 01/12/24

4 Ciccillo rossi. Xxxxxx. 05/08/24. X

Grazie

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

41 risposte

Ordina per: Più recente
  1. Anonimo
    2024-09-23T17:31:38+00:00

    Ciao Salvatore,

    se vuoi fare dei testo su questa nuova versione del file ti metto il link

    Invio automatico e-mail promemoria excel 2019 #2.xlsm

    Ti spiego l'approccio e vedi tu se ti sembra funzionale per le tue esigenze.

    La particolarità è che nell'unica colonna di "check" (naturalmente per ogni data di scadenza dei documenti e corsi) viene inserita una stringa che rappresenta l'email per il termine mancante alla scadenza.

    In particolare "6m" (scadenza entro 6 mesi o meno), "3m" (scadenza entro 3 mesi o meno), "1m" (scadenza entro 1 mese o meno) e "15g" (scadenza entro 15 giorni o meno).

    Se ci si trova in uno di quei periodi e nella cella della check non è presente la relativa stringa verrà creata l'email.

    Man mano che vengono inviate le email per i diversi tempi di scadenza la cella del "check" conterrà tutte le relative stringe separate da una virgola (6m,3m,1m,15g).

    Il codice nel modulo1 è un po' cambiato.

    Ho eliminato una costante (quella che serviva per impostare il periodo di tempo alla scadenza) visto che ora i periodi sono 4.

    E un'altra costante, quella che inseriva la "X" nella cella della "check", è ora diventata una variabile all'intero della routine "CreaEmailScadenze".

    Oltre al fatto che ho cambiato approccio per determinare quella che, prima, era la data di avviso.

    Ora, per gestire i vari intervalli, ho dichiarato quattro variabili che, partendo dalla data di scadenza, e andando in dietro nel tempo, calcolano la date date che, confrontate con la data "odierna", verificano se mancano da 6 mesi fino a 3 mesi, poi da 3 mesi a 1 mese, da 1 mese a 15 giorni, e da 15 giorni in giù.

    Questo il codice sempre presente in Modulo1 (riporto nuovamente tutto anche le parti non modificate):

    Option Explicit 
    
    Public Const NDoc As Long = 2 '<=== in caso di aggiunta di nuovi documenti indicare qui il numero complessivo di documenti 
    
    Public Const NCorsi As Long = 11 '<=== in caso di aggiunta di nuovi corsi indicare qui il numero complessivo dei corsi 
    
    Public Const sNomeFoglioPC As String = "Pandettamento_Corsi" '<=== nome foglio dati pandettamento e corsi 
    
    Public Const sNomeTabellaPC As String = "TabellaPandettamentoCorsi" '<=== nome tabella dati pandettamento e corsi 
    
    Public Const bInviaEmailAutomaticamente As Boolean = False '<=== impostare True per invio immediato dell'email 
    
    'Public Const sStringaCheck As String = "X" '<=== se si volesse iserire un diverso carattere per il check modificare qui 
    
    Function oLoPC() As ListObject 
    
       Set oLoPC = ThisWorkbook.Worksheets(sNomeFoglioPC).ListObjects(sNomeTabellaPC) 
    
    End Function 
    
    Sub CreaEmailScadenze(Optional oLoRow As Variant) 
    
       Dim StartRow As Long 
    
       Dim oLoRows As Long 
    
       Dim i As Long, j As Long 
    
       Dim DataAvviso6m As Date 
    
       Dim DataAvviso3m As Date 
    
       Dim DataAvviso1m As Date 
    
       Dim DataAvviso15g As Date 
    
       Dim DataScadenza As Date 
    
       Dim sGrado As String 
    
       Dim sCognome As String 
    
       Dim sNome As String 
    
       Dim sEmail As String 
    
       Dim sTipoDocCorso As String 
    
       Dim sNomeDocCorso As String 
    
       Dim sStringaCheck As String 
    
       Dim sCheck As String 
    
       Dim bSendMail As Boolean 
    
       Dim sTempoMancante As String 
    
       Dim sTestoOggettoMail As String 
    
       Dim sTestoCorpoMail As String 
    
       With oLoPC 
    
          If IsMissing(oLoRow) Then 
    
             StartRow = 1 
    
             oLoRows = .ListRows.Count 
    
          Else 
    
             StartRow = oLoRow 
    
             oLoRows = oLoRow 
    
          End If 
    
          For i = StartRow To oLoRows 
    
             sGrado = .ListColumns("GRADO").DataBodyRange(i).Value 
    
             sCognome = .ListColumns("COGNOME").DataBodyRange(i).Value 
    
             sNome = .ListColumns("NOME").DataBodyRange(i).Value 
    
             sEmail = .ListColumns("POSTA ELETTRONICA").DataBodyRange(i).Value 
    
             For j = 1 To NDoc 
    
                bSendMail = False 
    
                DataScadenza = .ListColumns("DATA DI SCADENZA D" & j).DataBodyRange(i).Value 
    
                sTipoDocCorso = "documento" 
    
                sNomeDocCorso = .ListColumns("NUMERO D" & j).Range(1).Offset(-1).Value 
    
                sCheck = .ListColumns("CHECK D" & j).DataBodyRange(i).Value 
    
                If DataScadenza <> "00:00:00" Then 
    
                   DataAvviso6m = DateAdd("M", -6, DataScadenza) 
    
                   DataAvviso3m = DateAdd("M", -3, DataScadenza) 
    
                   DataAvviso1m = DateAdd("M", -1, DataScadenza) 
    
                   DataAvviso15g = DateAdd("D", -15, DataScadenza) 
    
                   If Date >= DataAvviso6m And Date < DataAvviso3m Then 
    
                      If InStr(1, sCheck, "6m") = 0 Then bSendMail = True 
    
                      sStringaCheck = "6m" 
    
                      sTempoMancante = "sei mesi" 
    
                   ElseIf Date >= DataAvviso3m And Date < DataAvviso1m Then 
    
                      If InStr(1, sCheck, "3m") = 0 Then bSendMail = True 
    
                      sStringaCheck = "3m" 
    
                      sTempoMancante = "tre mesi" 
    
                   ElseIf Date >= DataAvviso1m And Date < DataAvviso15g Then 
    
                      If InStr(1, sCheck, "1m") = 0 Then bSendMail = True 
    
                      sStringaCheck = "1m" 
    
                      sTempoMancante = "un mese" 
    
                   ElseIf Date >= DataAvviso15g Then 
    
                      If InStr(1, sCheck, "15g") = 0 Then bSendMail = True 
    
                      sStringaCheck = "15g" 
    
                      sTempoMancante = "quindici giorni" 
    
                   End If 
    
                   If bSendMail Then 
    
                      sTestoOggettoMail = sGrado & " " & sCognome & " " & sNome & " - " & _ 
    
                                          "Avviso scadenza " & sTipoDocCorso & " """ & sNomeDocCorso & _ 
    
                                          """ con data scadenza " & DataScadenza 
    
                      sTestoCorpoMail = "Egr. " & sGrado & " " & sCognome & " " & sNome & "," & Chr(10) & _ 
    
                                        "si avvisa che per il " & sTipoDocCorso & " """ & sNomeDocCorso & _ 
    
                                        """con data scadenza " & DataScadenza & " mancano meno di " & sTempoMancante & " alla scadenza." & String(2, Chr(10)) & _ 
    
                                        "Cordiali saluti" 
    
                      Call CreaEmailHtml(sEmail, sTestoOggettoMail, sTestoCorpoMail, , , , bInviaEmailAutomaticamente) 
    
                      If sCheck = "" Then 
    
                         sCheck = sStringaCheck 
    
                      Else 
    
                         sCheck = sCheck & "," & sStringaCheck 
    
                      End If 
    
                      .ListColumns("CHECK D" & j).DataBodyRange(i).Value = sCheck 
    
                   End If 
    
                End If 
    
             Next j 
    
             For j = 1 To NCorsi 
    
                bSendMail = False 
    
                DataScadenza = .ListColumns("SCADENZA C" & j).DataBodyRange(i).Value 
    
                sTipoDocCorso = "corso" 
    
                sNomeDocCorso = .ListColumns("ULTIMO C" & j).Range(1).Offset(-1).Value 
    
                sCheck = .ListColumns("CHECK C" & j).DataBodyRange(i).Value 
    
                If DataScadenza <> "00:00:00" Then 
    
                   DataAvviso6m = DateAdd("M", -6, DataScadenza) 
    
                   DataAvviso3m = DateAdd("M", -3, DataScadenza) 
    
                   DataAvviso1m = DateAdd("M", -1, DataScadenza) 
    
                   DataAvviso15g = DateAdd("D", -15, DataScadenza) 
    
                   If Date >= DataAvviso6m And Date < DataAvviso3m Then 
    
                      If InStr(1, sCheck, "6m") = 0 Then bSendMail = True 
    
                      sStringaCheck = "6m" 
    
                      sTempoMancante = "sei mesi" 
    
                   ElseIf Date >= DataAvviso3m And Date < DataAvviso1m Then 
    
                      If InStr(1, sCheck, "3m") = 0 Then bSendMail = True 
    
                      sStringaCheck = "3m" 
    
                      sTempoMancante = "tre mesi" 
    
                   ElseIf Date >= DataAvviso1m And Date < DataAvviso15g Then 
    
                      If InStr(1, sCheck, "1m") = 0 Then bSendMail = True 
    
                      sStringaCheck = "1m" 
    
                      sTempoMancante = "un mese" 
    
                   ElseIf Date >= DataAvviso15g Then 
    
                      If InStr(1, sCheck, "15g") = 0 Then bSendMail = True 
    
                      sStringaCheck = "15g" 
    
                      sTempoMancante = "quindici giorni" 
    
                   End If 
    
                   If bSendMail Then 
    
                      sTestoOggettoMail = sGrado & " " & sCognome & " " & sNome & " - " & _ 
    
                                          "Avviso scadenza " & sTipoDocCorso & " """ & sNomeDocCorso & _ 
    
                                          """ con data scadenza " & DataScadenza 
    
                      sTestoCorpoMail = "Egr. " & sGrado & " " & sCognome & " " & sNome & "," & Chr(10) & _ 
    
                                        "si avvisa che per il " & sTipoDocCorso & " """ & sNomeDocCorso & _ 
    
                                        """con data scadenza " & DataScadenza & " mancano meno di " & sTempoMancante & " alla scadenza." & String(2, Chr(10)) & _ 
    
                                        "Cordiali saluti" 
    
                      Call CreaEmailHtml(sEmail, sTestoOggettoMail, sTestoCorpoMail, , , , bInviaEmailAutomaticamente) 
    
                      If sCheck = "" Then 
    
                         sCheck = sStringaCheck 
    
                      Else 
    
                         sCheck = sCheck & "," & sStringaCheck 
    
                      End If 
    
                      .ListColumns("CHECK C" & j).DataBodyRange(i).Value = sCheck 
    
                   End If 
    
                End If 
    
             Next j 
    
          Next i 
    
       End With 
    
    End Sub 
    
    Sub CreaEmailHtml(sTo As String, _ 
    
                      sOggettoEmail As String, _ 
    
                      sTestoEmail As String, _ 
    
                      Optional sCC As String, _ 
    
                      Optional sCCN As String, _ 
    
                      Optional sAllegati As String, _ 
    
                      Optional bSendMail As Boolean = False) 
    
       Dim oOutlook As Object 
    
       Dim oMail As Object 
    
       Dim arrAllegati As Variant 
    
       Dim i As Long 
    
       Set oOutlook = CreateObject("Outlook.Application") 
    
       Set oMail = oOutlook.CreateItem(0) 
    
       With oMail 
    
          .BodyFormat = 2 'HTML 
    
          .Display 
    
          .To = Trim(sTo) 
    
          .cc = Trim(sCC) 
    
          .BCC = Trim(sCCN) 
    
          If .To = "" And _ 
    
             .cc = "" And _ 
    
             .BCC = "" Then 
    
             bSendMail = False 
    
          End If 
    
          .Subject = Trim(sOggettoEmail) 
    
          sTestoEmail = Replace(Trim(sTestoEmail), Chr(10), "<br>") 
    
          sTestoEmail = "<HTML><BODY><p style='font-family:Calibri;font-size:11pt'>" & sTestoEmail & "</p></BODY></HTML>" 
    
          .HTMLBody = sTestoEmail & .HTMLBody 
    
          .ReadReceiptRequested = True 
    
          .OriginatorDeliveryReportRequested = .ReadReceiptRequested 
    
          On Error Resume Next 
    
          If sAllegati <> "" Then 
    
             arrAllegati = Split(sAllegati, ";") 
    
             For i = 0 To UBound(arrAllegati) 
    
                .Attachments.Add Trim(arrAllegati(i)) 
    
                If Err.Number <> 0 Then 
    
                   MsgBox "L'allegato" & vbNewLine & Trim(arrAllegati(i)) & vbNewLine & _ 
    
                          "non è stato trovato!", vbExclamation, "Errore Allegato" 
    
                   bSendMail = False 
    
                   Err.Clear 
    
                End If 
    
             Next i 
    
          End If 
    
          On Error GoTo 0 
    
          If bSendMail Then .send 
    
       End With 
    
       Set oOutlook = Nothing 
    
       Set oMail = Nothing 
    
    End Sub 
    

    Fai dei test con i tuoi dati reali e aggiusta il testo delle email a piacimento.

    Per come ho impostato io il testo ottengo delle email del genere:

    Ciao

    p.s. nelle colonne delle date di scadenza ho inserito quattro formattazioni condizionali con differenti sfondi a seconda di quanto manchi alla scadenza.

    Vedi tu se mantenerle o modificarle.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2024-09-23T14:18:10+00:00

    Si, grazie.

    Io intanto provo a studiarci su. Magari anche inserendo 4 colonne di check per ogni scadenza. Certo, sarebbero molte colonne in più, ma forse mi viene più facile provare a tirare giù un codice.

    Provo....

    Grazie sempre

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2024-09-23T12:38:00+00:00

    Ciao,

    la cosa si complica abbastanza perché non basterebbe la semplice dichiarazione di più costanti. Andrebbe rivisto il codice per fare in modo che partano diverse email in base al tempo che manca (con immagino un testo che indichi che mancano meno di 6 mesi, meno di 3 ecc. ecc.).

    Dovrei pensare su un po' per capire se sia possibile una soluzione "semplice" e che non stravolga la struttura della tabella.

    Quando ho un po' di tempo ci penso su e ti faccio sapere.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2024-09-23T11:04:31+00:00

    Ciao, ho fatto il test del file e funziona alla grande.

    Ho modificato alcune piccole cose, come il testo della mail e poco altro e volevo implementare una funzione aggiuntiva. Ovvero fare si che le mail di avviso, oltre che 6 mesi prima, vengano inviate anche 3 mesi prima, 1 mese prima e 15 giorni prima aggiungendo al check una "x" in più senza bisogno di aggiungere colonne.

    Per fare questo dovrei:

    1. dichiarare più costanti con As Long 2. modificare la creazione del testo

    Sono sulla strada giusta?

    Non vorrei sembrare fastidioso, mi voglio impegnare per capire. Purtroppo le basi che ho, sono scarse e da autodidatta. Per di più non facendolo spesso, il poco che so lo devo pure rivedere.....

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2024-09-21T11:16:13+00:00

    Più tardi provo con un altro PC e ti faccio sapere.

    Intanto GRAZIE per il tuo prezioso lavoro

    La risposta è stata utile?

    0 commenti Nessun commento