Combinate Sub IF con Email



  • Combinate Sub IF con Email
    di Ragno (utente non iscritto) data: 12/03/2014 00:11:51

    Signori con abbastanza fatica ho provato a mettere insieme due Sub per far partire delle mail automatiche da un foglio excel, se nella casella scadenza la data è minore di quella odierna.
    Purtroppo la mia pochissima conoscenza di VBA mi ha ucciso il processo.
    Ho provato quindi due sub correlate, ma non va mi manda le mail a cavolo a volte raddoppia pure le mail, senza tenere conto del comando IF.
    Vi allego i codici.. si possono unire in un unica SUB?
     
    Sub dat()
    Dim CL As Object
    Dim X
    Application.ScreenUpdating = False
    X = Date
    Set Rng = Range("d4:d6") '
    For Each CL In Rng
    If CL > X And CL <> 0 Then
    Application.Run ("Autoemail")
    
    
    End If
    Next
    Application.ScreenUpdating = True
    End Sub
    Sub Autoemail()
    
        Dim OutApp As Object
        Dim OutMail As Object
        Dim EmailAddr As String
        Dim Subj As String
        Dim BodyText As String
        
        Foglio1.Select
        
    
    ' RR contiene il numero di utenti cui inviare le e-mail (1 per utente)
        RR = Range("B" & Rows.Count).End(xlUp).Row
    ' I dati iniziano dalla quarta riga
        For i = 4 To RR
            Set OutApp = CreateObject("Outlook.Application")
            Set OutMail = OutApp.CreateItem(0)
            With OutMail
                      ' La colonna "B" contiene gli indirizzi e-mail dei vari destinatari
                      .To = Cells(i, 2)
                      ' La colonna "C" contiene l'indirizzo e-mail in "Copia per Conoscenza"
                      .CC = "varesi.f@fater.it"
    
                      .Subject = Cells(i, 5)
                      ' La colonna "E" contiene l testo della e-mail
                      
                      .Body = "THE PROCEDURE IN THE TITLE IS EXPIRED"
                      .Display
            End With
            Set OutMail = Nothing
            Set OutApp = Nothing
            Application.SendKeys "%a"
        Next i
    
    End Sub



  • di Andrea (utente non iscritto) data: 12/03/2014 08:46:35

    Ci sono riuscito, avevo posizionato male i comandi della male e degli IF... ora ho risolto, grazie a voi ed ai vostri vari topics ;)
    GRAZIE



  • di Vecchio Frac data: 12/03/2014 18:33:37

    Quel SendKeys è orribile ^_^
    Considera l'uso di un programma apposito, tipo Express ClickYes, per rispondere "Sì" alla domanda di sicurezza di Outlook circa l'invio automatico di email.





  • di Andrea (utente non iscritto) data: 17/03/2014 15:51:13

    Signori nun funziona più evidentemente ho sbajato qualcosa ma non so :(
    Sostanzialmente alla chiusura del file si dovrebbe mandare in automatico una mail se nel file di excel nella casella relativa alla colonna D (range) trova una data che sia maggiore di oggi -30gg
    Cavolo sto diventando matto... al momento mi manda tre mails e per giunta riferita alla linea sbagliata :(
    Ho aggiunto anche il file XLS per aiuto
     
    Sub Auto_Close()
    
    Dim rng As Range, data1 As Date, data2 As Date, cella
    Set rng = Range("d1:D1000")
    data1 = Date - 30
    data2 = Date
    For Each cella In rng
    If cella >= data1 And cella <= data2 Then
       
        Dim OutApp As Object
        Dim OutMail As Object
        Dim EmailAddr As String
        Dim Subj As String
        Dim BodyText As String
        
        Foglio1.Select
        
    
    ' RR contiene il numero di utenti cui inviare le e-mail (1 per utente)
        RR = Range("B" & Rows.Count).End(xlUp).Row
    ' I dati iniziano dalla quarta riga
        i = 4
            Set OutApp = CreateObject("Outlook.Application")
            Set OutMail = OutApp.CreateItem(0)
            With OutMail
                      ' La colonna "B" contiene gli indirizzi e-mail dei vari destinatari
                      .To = Cells(i, 2)
                      ' La colonna "C" contiene l'indirizzo e-mail in "Copia per Conoscenza"
                      .CC = "varesi.f@fater.it"
    
                      .Subject = Cells(i, 5)
                      ' La colonna "E" contiene l testo della e-mail
                      
                      .Body = "THE PROCEDURE IN THE TITLE IS GOING TO EXPIRE or IS ALREADY EXPIRED"
                           
                      .Send
            End With
            Set OutMail = Nothing
            Set OutApp = Nothing
            Application.SendKeys "%a"
     
    End If
    
    
        
    Next
    End Sub
    
    



  • di Vecchio Frac data: 17/03/2014 18:00:02

    Il codice non è un mostro di chiarezza ma, nella mia simulazione, funziona come dovrebbe (individua la riga con la data compresa nell'intervallo dato di 30 giorni, costruisce la mail con i dati corretti, cerca di spedirla... ("cerca" perchè ho sostituito .Display con .Send ^_^).
    Ti consiglio di utilizzare l'esecuzione passo-passo con F8 per verificare dove sia il problema (al 99% il tuo problema sta nella scrittura della data).
    Ci sono altri commenti... io userei DateDiff per verificare che l'intervallo tra la data in cella e l'attuale sia di 30 giorni).
    Usa Option Explicit che ti salva la vita da errori di battitura.
    Metti tutte le Dim a inizio codice, dopo la firma della Sub.
    Usa l'evento BeforeClose invece che AutoClose, retaggio del passato.
    Non creare ogni volta nel ciclo For l'oggetto Outlook.Application, è uno spreco di risorse, istanziane uno solo prima del ciclo e chiudilo al termine.
    Non impostare Foglio1.Select ad ogni passaggio del ciclo, è inutile e porta via tempo.
    Non impostare un range abissale, fagli calcolare l'esatta dimensione dei dati in colonna D (l'ultima riga l'hai già trovata: vedi "RR") e comunque fallo partire da D4, non D1.

    E non sono sicuro neanche di quel SendKeys :)






  • di Vecchio Frac data: 17/03/2014 18:01:26

    Errata corrige.
    originale: "cerca" perchè ho sostituito .Display con .Send
    leggasi: "cerca" perchè ho sostituito .Send con .Display
    (ovviamente ^_^)





  • di Andrea (utente non iscritto) data: 17/03/2014 21:27:51

    Caro Vecchio Frac, grazie tante per la risposta, purtroppo però non ho capito un gran chè :(
    Considera che non sono uno programma ma rubacchio qua e la e cerco di mettere insieme le cose per fare quello che mi serve...ergo tutto quello che mi hai scritto [e sono sicuro che siano consigli preziosi] non so come implementarli #sigh#
    Se potessi scrivermi i cambi per migliorarlo te ne sarei grato, perché oggi ho provato a farlo girare ma non spediva :/
    Poi cercherò di capire, ma al momento sono totalmente all'oscuro...
    GRAZIE



  • di Andrea (utente non iscritto) data: 18/03/2014 09:24:26

    Ciao Vecchio Frac ho apportato alcune modifiche come mi hai suggerito le altre, purtroppo non ho capito come fare, come detto il altri discussioni, non ci capisco molto, spesso vado ingiro sulla rete e cerco di capire la logica dietro ai codici....e vedo se posso riapplicare per i miei scopi, sono totalmente autodidatta e con background completamente diverso :/
    Allego il file KE5 second perchè mi sono accorto che c'è un problema con l'invio delle e:mail.
    Nel file originale ho messo due righe con date scadute ma mi manda due volte la mail per la prima istanza che trova :(
    Che c'è di sbagliato?