› Sviluppare funzionalita su Microsoft Office con VBA › Posticipare recapito e-mail
-
AutoreArticoli
-
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 SubPerò 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
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 )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 eccciao,
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 Withma 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
>>>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/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 SubCiao 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 SubInfatti 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
Di norma, quando si accende una "lampadina", bisogna pure spegnerla?
Set AppMail ........
Set NewMail ........
con
Set AppMail = Nothing
Set NewMail = NothingPer 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...??? -
AutoreArticoli
