Sviluppare funzionalita su Microsoft Office con VBA Posticipare recapito e-mail

Login Registrati
Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)
  • Autore
    Articoli
  • #32597 Score: 0 | Risposta

    marco_budin
    Partecipante
      2 pts

      Buongiorno a tutti,

      volevo chiedervi aiuto per una cosa che non riesco ad implementare. Ho un file excel dove parte in automatico una mail con una macro:

      Sub email_TC_RA()
      
          Dim iMsg As Object
          Dim iConf As Object
          Dim xStrBody As String
          Dim Flds As Variant
          Dim Nome As String
          Dim Oggetto As String
          Dim indirizziTO As String
          Dim IndirizziCC As String
      
      Set iMsg = CreateObject("CDO.Message")
      Set iConf = CreateObject("CDO.Configuration")
      
      iConf.Load -1    ' CDO Source Defaults
      Set Flds = iConf.Fields
      With Flds
      .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 
      .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = ""
      .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 
      .Update
      End With
      
      indirizziTO = Sheets("DataBase").Range("e4")
      IndirizziCC = Sheets("DataBase").Range("d4")
      
      Oggetto = "Nuova richiesta di validazione TAC: " & Format(Now, "dd-mm-yyyy")
      strbody = "Buongiorno," & vbCrLf & _
      "è stata inoltrata una richiesta di validadazione scheda TAC per " & Sheets("CheckTC").Range("d9") & ". Trovi il file per la validazione: " & Sheets("DataBase").Range("j4") & "." & vbCrLf & vbNewLine & _
      "Cordiali Saluti" & vbNewLine & _
      "" & vbNewLine & _
      "" & vbNewLine & _
      "Attenzione: Questo messaggio viene generato automaticamente. Non rispondere!"
      
          With iMsg
              Set .Configuration = iConf
              .To = indirizziTO
              .CC = IndirizziCC
              .BCC = ""
              .From = "RichiestaValTAC.NOReply@eoc.ch"
              .Subject = Oggetto
              .TextBody = strbody
              .Send
          End With
      
          Set iMsg = Nothing
          Set iConf = Nothing
          Set Flds = Nothing
      
      Sheets("CheckTC").Select
      Range("b4").Select
      
      End Sub

       

      Però io ho necessità che questa mail venga spedita in una data precisa (se deve essere messo anche l'orario va bene le 8:00, altrimenti può essere anche evitato) che indico nella casella: Sheets("CheckTC").Range("G47").

      Posso chiedervi dove, come e cosa devo inserire? Penso che debba essere inserito in fondo nell'elenco iMsg.

      Spero che qualcuno possa aiutarmi.

      saluti

      Marco

      #32602 Score: 0 | Risposta

      albatros54
      Moderatore
        89 pts

        secondo me dovredti inserire un ciclo if che controlla la data inserita nella tua cella con la data odierna se corrisponde invia email altrimenti esci dalla sub. Il controllo lo potresti fare in due modi:

        inserendo la routine all'inizio della macro, o prima del comando".send"

         

         

        Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
        Sempre il mare, uomo libero, amerai!
        ( Charles Baudelaire )
        #32603 Score: 0 | Risposta

        Raffaele53
        Partecipante
          22 pts

          Si dovrebbe usare una "pianificazione", intendo il Bios accende il PC e avvia il files il giorno tal dei tali (All'apertura, una nuova macro invia la mail)....Troppo "macchinoso".
          Metodo se ogni giorno apri il files, un codice che verifica la "data precisa" ed invia
          Andrebbe pure bene se ci sono molte mail da inviare, mettendo in colonna E tanti indirizzi.
          Ipotesi per riga4 ed in Z4 una data futura.
          Ogni mattina quando apri il files, Excel verifica riga/righe se la data in colonna Z sia uguale/minore.
          Di contro se non apri il files non fà nulla (casomai l'invia i giorni dopo quando riaprirai il files)

          Public x As Long
          Sub Auto_open() 'puo funzionare solo una di questi due
          If IsDate(Cells(4, "Z")) Then
              If Date >= Cells(4, "Z") Then Call email_TC_RA: Cells(4, "Z") = "Già Inviata"
          End If
          End Sub
          Sub Auto_open()
          Dim Ur As Long
          Ur = Range("E" & Rows.Count).End(xlUp).Row
              For x = 1 To Ur ' al posto di 1 metti la riga d'inizio
                  If IsDate(Cells(x, "Z")) Then
                      If Date >= Cells(x, "Z") Then Call email_TC_RA: Cells(x, "Z") = "Già Inviata"
                  End If
              Next x
          End Sub
          'naturale che in email_TC_RA,i range siano scritti ex ..Range("e" & x), Range("d" & x) ecc ecc
          #32604 Score: 0 | Risposta

          marco_budin
          Partecipante
            2 pts

            ciao,

            grazie mille delle vostre risposte. io ho trovato questo codice da inserire nel iMsg:  .DeferredDeliveryTime = Range("g43")

            With iMsg
                    Set .Configuration = iConf
                    .To = indirizziTO
                    .CC = IndirizziCC
                    .BCC = ""
                    .From = "RichiestaValTAC.NOReply@eoc.ch"
                    .Subject = Oggetto
                    .TextBody = strbody
                     .DeferredDeliveryTime = Range("g43")
                    .Send
                End With

             

            ma purtroppo non funziona.

            a me non serve mandarlo in automatico a quella data, ma io schiaccio il pulsante per l'invio della mail. ma al posto di mandarlo quel giorno stesso che schiaccio il pulsante, posticipa l'inoltro. In Outlook vi è la possibilità di posticipare. Pensavo che ci fosse un comando per farlo anche con excel. Ma ho provato appunto il  .DeferredDeliveryTime = Range("g43") ma non funziona. mi da errore.

            sperando di trovare una soluzione, vi ringrazio entrambi per la risposta.

            saluti 

            Marco

            #32607 Score: 0 | Risposta

            Raffaele53
            Partecipante
              22 pts

              >>>In Outlook vi è la possibilità di posticipare.
              Già ma quello sopra non è per Outlook e quello da usare senza nessun gestore di posta.
              http://www.alfainfo.it/come-inviare-una-email-con-vba/

              #32610 Score: 0 | Risposta

              Raffaele53
              Partecipante
                22 pts

                Per curiosita ho provato DeferredDeliveryTime e funziona cul mio con  Outlook aperto

                'Aggiunto in Strumenti\Riferimenti\Microsoft Office 15.0 Object
                Sub sInviaEmail()
                Dim NewMail As Object
                Dim DData As Date
                Set NewMail = CreateObject("Outlook.Application").CreateItem(oMailItem)
                With NewMail
                  .To = Worksheets("Foglio1").Range("E4").Value
                  .Subject = "Invio di prova"
                  .Body = "Potrebbe essere il riferimento a una cella, così sarebbe un testo variabile"
                  '.CC =  indirizzo in copia per conoscenza, se mi serve. qui è commentato
                  '.DeferredDeliveryTime = DateAdd("n", 10, Now) ' 10 = 10 minuti
                  '.DeferredDeliveryTime = #1/1/2022 8:00:00 PM# ' usare il formato USA(mese-giorno-anno)
                  '.DeferredDeliveryTime = Date + 8 + TimeSerial(8, 0, 0) 'Tra otto giorni alle "8:00:00", se Outloook è aperto
                  .Send
                End With
                Set NewMail = Nothing
                End Sub
                #32621 Score: 0 | Risposta

                marco_budin
                Partecipante
                  2 pts

                  Ciao Raffaele53,

                  grazie mille della tua proposto. Infatti dopo che mi hai specificato nel post soprastante che: "Già ma quello sopra non è per Outlook e quello da usare senza nessun gestore di posta." mi hai illuminato, e ho capito che così non funziona.

                  Ho quindi scritto la vba mail per outlook e adesso infatti funziona tutto alla perfezione   

                  Vi allego il codice per qualcuno che fosse interessato ad usarlo:

                  Sub email_TC_RA_fine()
                  
                  Dim AppMail As Object 'Outlook.Application
                  Dim NewMail As Object 'Outlook.Application
                  Dim indirizziTO As String
                  Dim IndirizziCC As String
                  Dim Oggetto As String
                  Dim Testo As String
                  
                  On Error Resume Next
                  Set AppMail = GetObject(, "Outlook.Application")
                  If Err.Number <> 0 Then
                      Err.Clear
                      Set AppMail = CreateObject("Outlook.Application")
                      AppMail.Session.Logon
                  
                      If Err <> 0 Then
                          MsgBox "Could not load Outlook", vbOKOnly + vbInformation, "Error report"
                          End
                      End If
                  End If
                  indirizziTO = Sheets("CheckTC").Range("ab16")
                  IndirizziCC = Sheets("CheckTC").Range("ab17") & ";" & Sheets("CheckTC").Range("ab13")
                  Set NewMail = AppMail.CreateItem(0)
                  
                  Oggetto = "Scadenza obbiettivi TAC: " & Format(Now, "dd-mm-yyyy")
                  Testo = "Buongiorno" & vbCrLf
                  Testo = Testo & "" & vbCrLf
                  Testo = Testo & "in data " & Format(Now, "dd-mm-yyyy") & "hai ricevuto degli obbiettivi per la modalità TC. Il termine è scaduto, ti chiedo gentilmente di effettuare nuovamente la scheda di abilitazione" & vbCrLf
                  Testo = Testo & "" & vbCrLf
                  Testo = Testo & "Cordiali Saluti" & vbCrLf
                  Testo = Testo & "" & vbCrLf
                  Testo = Testo & "" & vbCrLf
                  Testo = Testo & "Attenzione: Questo messaggio viene generato automaticamente. Non rispondere!" & vbCrLf
                  
                  With NewMail
                      .To = indirizziTO
                      .CC = IndirizziCC
                      .Subject = Oggetto
                      .body = Testo & .body
                      .DeferredDeliveryTime = Sheets("CheckTC").Range("ae21")
                      .Display
                  End With
                  
                  NewMail.SEND
                  
                  Sheets("CheckTC").Select
                  Range("b4").Select
                  
                  End Sub

                   

                  Infatti in questo caso poi il codice:

                  .DeferredDeliveryTime = Sheets("CheckTC").Range("ae21")

                  funziona alla grande!!

                  Invece con il codice precedente come dicevi giustamente tu, purtroppo non andava.

                   

                  vi ringrazio tutti del vostro prezioso aiuto e soprattutto disponibili sempre ad aiutare a trovare delle soluzioni insieme!

                  saluti e a presto

                  Marco

                  #32640 Score: 0 | Risposta

                  Raffaele53
                  Partecipante
                    22 pts

                    Di norma, quando si accende una "lampadina", bisogna pure spegnerla?
                    Set AppMail ........
                    Set NewMail ........
                    con
                    Set AppMail = Nothing
                    Set NewMail = Nothing

                    Per finire, non capisco tutte "quelle variabili d'errore"?
                    Se un qualsiasi dato è mancante/errore? Basta farci solo un controllo. Cosa significa...
                    On Error Resume Next
                    Set AppMail = GetObject(, "Outlook.Application")...???
                    If Err.Number <> 0 Then...???
                    Err.Clear...???
                    Set AppMail = CreateObject("Outlook.Application") ........due volte...???

                  Login Registrati
                  Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)
                  Rispondi a: Posticipare recapito e-mail
                  Gli allegati sono permessi solo ad utenti REGISTRATI
                  Le tue informazioni: