Sviluppare funzionalita su Microsoft Office con VBA inviare e-mail automatiche quando un cell assume un certo valore numerico

LoginRegistrati
Stai vedendo 15 articoli - dal 1 a 15 (di 15 totali)
  • Autore
    Articoli
  • #24426 Risposta

    klaus
    Partecipante

      Ho trovato molti tutorial su come fare partire una o più email, anche senza aprire outlook, con testo predefinito. Il mio problema è l'evento che le provoca. Vorrei che ciò accadesse quando il valore di una determinata cella situata in un intervallo (una colonna, anche collocata in più fogli), assume un valore al di sotto di un certo numero. Ho una foglio di monitoraggio delle scadenze, con il nome di tanti colleghi in una colonna, e poi nella colonna di fianco inserisco io delle scadenza. In un'altra colonna excel mi calcola i giorni che mancano rispetto ad oggi, e lo fa ogni volta che apro il foglio excel. Vorrei che dove il giorno rimanenti è inferiorio a 10, ad esempio, parta automaticamente una e-mail con testo standard. Tipo "verifica le tue scadenze". L'evento è il risultato di una formuta di "oggi"-data, quando inferiore a 10. Qualcuno ha blocchi di codici da indicarmi o soluzioni per la parte che riguarda l'evento iniziale? Grazie.

      #24427 Risposta
      albatros54
      albatros54
      Moderatore
        51 pts

        klaus ha scritto:

        In un'altra colonna excel mi calcola i giorni che mancano rispetto ad oggi, e lo fa ogni volta che apro il foglio excel. Vorrei che dove il giorno rimanenti è inferiorio a 10

        una soluzione potrebbe essere quella di ciclare tute le celle dove tua hai il valore da controllare ,e se il valore trovato è inferiore o uguale al tuo target , fa inviare'email.

         


        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 )
        #24429 Risposta

        klaus
        Partecipante

          l'idea mi sembra eccellente. Ma sono alle prime armi. Mi puoi aiutare col codice? La colonna da ciclare è la colonna E del foglio 2, 3, 4, 5, (fino a 29, anche se a ciascun foglio ho dato un nome; devo usare il nome del foglio vero?). Il valore che fa partire la e-mail è quello minore di 10. Ma tutti gli indirizzi e-mail si trovano elencati nella colonna C dalla riga 3 del foglio 1 (anche questo in realtà ha un nome). Gli indirizzi email si trovano nello stesso ordine del nome di ciascun foglio. Voglio dire che l'indirizzo che si trova nella colonna C della riga 3 corrisponde al nome del foglio 2, quello sotto (C4) al foglio 3, ecc.

           

           

          #24430 Risposta
          patel
          patel
          Moderatore
            37 pts

            allega un file di esempio

            #24432 Risposta

            klaus
            Partecipante

              Il foglio è strutturato come quello allegato. Quando io inserisco una data nella colonna D, nella colonna E mi calcola i giorni che mancano calcolati con la funzione "oggi". Io vorrei che inviasse una email con testo da stabilire (anche solo "attenzione") alla persona cui si riferisce il foglio, prendendo l'indirizzo nel foglio "tutti", quando i giorni della colonna E sono meno di 10 (nel sample accade nel foglio di "pinco"). E che la inviasse quando si apre il foglio (che quindi rimarrebbe aperto tutto il giorno). Oppure premendo un pulsante (se non complica troppo il codice). L'unica differenza tra questo sample (dove i dati sono stati modificati) e quello vero, è che quello vero ha 29 fogli (che si chiamano come i 29 nomi che ho in elenco nel primo foglio).

              Allegati:
              You must be logged in to view attached files.
              #24437 Risposta
              patel
              patel
              Moderatore
                37 pts

                ti conviene utilizzare un pulsante nel foglio tutti ed una macro di questo genere che scansiona la colonna con i nomi, controlla la colonna date e mostra il messaggio. ovviamente al posto del messaggio devi inviare la mail. Resta il fatto che il tuo obiettivo non è banale anche per un esperto.

                Sub a()
                With Sheets("Tutti")
                  LR = .Cells(.Rows.Count, "A").End(xlUp).Row
                  For r = 2 To LR
                    foglio = .Cells(r, "A")
                    Email = .Cells(r, "B")
                    Set sh = Sheets(foglio)
                    LRF = sh.Cells(Rows.Count, "E").End(xlUp).Row
                    For riga = 2 To LRF
                      giorni = sh.Cells(riga, "E")
                      proc = sh.Cells(riga, "B")
                      If giorni < 10 And giorni > 0 Then
                        MsgBox "scadenza su foglio " & foglio & " giorni " & giorni & " Processo " & proc
                      End If
                    Next
                    
                  Next
                End With
                End Sub
                #24438 Risposta

                klaus
                Partecipante

                  GRAZIE!!!!

                  #24447 Risposta
                  patel
                  patel
                  Moderatore
                    37 pts

                    Klaus, se vuoi essere aiutato non usare i messaggi privati, il forum è frequentato da molti esperti che, se vedono che ti impegni, sono pronti ad aiutarti.

                    #24461 Risposta

                    klaus
                    Partecipante
                      Sub a()
                      With Sheets("Tutti")
                        LR = .Cells(.Rows.Count, "A").End(xlUp).Row
                        For r = 2 To LR
                          foglio = .Cells(r, "A")
                          Email = .Cells(r, "B")
                          Set sh = Sheets(foglio)
                          LRF = sh.Cells(Rows.Count, "E").End(xlUp).Row
                          For riga = 2 To LRF
                            giorni = sh.Cells(riga, "E")
                            proc = sh.Cells(riga, "B")
                            If giorni < 10 And giorni > 0 Then
                              MsgBox "scadenza su foglio " & foglio & " giorni " & giorni & " Processo " & proc
                              Dim inviamail As Object
                              Set inviamail = CreateObject("outlook.application").CreateItem(OmailItem)
                      With inviamail
                              .to = Email
                              .Subject = "prova"
                              .Body = "prova"
                              .Display
                              .Send
                         End With
                       Set inviamail = Nothing
                            End If
                          Next
                          
                        Next
                      End With
                      End Sub
                      #24462 Risposta

                      klaus
                      Partecipante

                        invece che togliere il MsgBox, ho aggiunto un Object. I problemi ovviamente nascono sul .to che deve essere variabile rispetto al risultato del ciclo IF. Anche se non mi dà errore, si apre outlook, ma non parte alcuna email. So che così come l'ho scritto non va bene, perchè il valore è preso dal ciclo r  = 2 to LR e non dal ciclo IF  "giorni < 10 And giorni > 0 Then". Forse che debbo ricreare un ciclo IF analogo all'interno dell'Object?

                        #24473 Risposta
                        patel
                        patel
                        Moderatore
                          37 pts

                          klaus ha scritto:

                          So che così come l'ho scritto non va bene, perchè il valore è preso dal ciclo r  = 2 to LR e non dal ciclo IF  "giorni < 10 And giorni > 0 Then"

                          Invece va bene, l'unico ciclo è il FOR, IF non è un ciclo, ma una condizione. A me il codice sembra corretto, ma non lo posso testare perché non uso outlook, attendi altri interventi.

                          #24605 Risposta

                          klaus
                          Partecipante
                            Sub a()
                            With Sheets("Tutti")
                              LR = .Cells(.Rows.Count, "B").End(xlUp).Row
                              For r = 3 To LR
                                foglio = .Cells(r, "B")
                                Email = .Cells(r, "C")
                                Set sh = Sheets(foglio)
                                LRF = sh.Cells(Rows.Count, "E").End(xlUp).Row
                                For riga = 3 To LRF
                                  giorni = sh.Cells(riga, "E")
                                  proc = sh.Cells(riga, "B")
                                  If giorni < 10 And giorni > 0 Then
                                  
                                  'aler per chi ha la scadenza'
                                    MsgBox "scadenza su foglio " & foglio & " giorni " & giorni & " Processo " & proc
                                    
                                   'invio email a chi ha la scadenza'
                                    Dim inviamail As Object
                                    Set inviamail = CreateObject("outlook.application").CreateItem(OlmailItem)
                            With inviamail
                                    .To = Email
                                    .Subject = "VERIFICA BENE LE TUE SCADENZE"
                                    .Body = "TI PREGO DI ASSICURARE LA MASSIMA ATTENZIONE ALLE SCADENZE CHE HAI CON MENO DI 10GG"
                                    .Display
                                    .Send
                               End With
                             Set inviamail = Nothing
                                  End If
                                Next
                                
                              Next
                            End With
                            End Sub
                            #24606 Risposta

                            klaus
                            Partecipante

                              finalmente il codice inizia a funzionare. Trova la scadenza con l'istruzione condizionale cercandola nella colonna e nel foglio che deve. Cicla correttamente le colonne giuste, partendo dalla riga giusta e fino a dove serve. E dove ci sono scadenze (valori <10), anche più di una, invia una email per ciascun nome e scadenza. Ora però ho due oscuri fenomeni (per me per lo meno). Uno è che l'email spesso viene prodotta ma rimane nella posta in uscita...Il secondo, forse in relazione col primo, è che malgrado il foglio compia quasi del tutto le azioni che deve mi dà ERRORE DI RUN TIME 9 - INDICE NON INCLUSO NELL'INTERVALLO, alla riga Set sh = Sheets(foglio).  

                              #24607 Risposta
                              patel
                              patel
                              Moderatore
                                37 pts

                                sei certo che a tutti i nomi dei fogli presenti nella lista corrisponda veramente un foglio ?

                                #24623 Risposta

                                klaus
                                Partecipante

                                  Credo di si. L'unico dubbio che mi viene e che non so spiegarmi (ma forse non significa nulla) è che nell'editor di VBA a sinistra in alto, dove ci sono tutti gli oggetti della cartella, i fogli non sono in ordine (1, 2, 3, ecc). Ho comunque ricontrollato la corrispondenza e la sequenza corretta dei nomi (del foglio "tutti" con i singoli fogli).

                                  Per darti meglio la possibilità di verificare se trovi l'errore di run time, ti mando il file originale.

                                  Allegati:
                                  You must be logged in to view attached files.
                                LoginRegistrati
                                Stai vedendo 15 articoli - dal 1 a 15 (di 15 totali)
                                Rispondi a: inviare e-mail automatiche quando un cell assume un certo valore numerico
                                Gli allegati sono permessi solo ad utenti REGISTRATI
                                Le tue informazioni:



                                vecchio frac - 2750 risposte

                                albatros54
                                albatros54 - 940 risposte

                                patel
                                patel - 817 risposte

                                Marius44
                                Marius44 - 708 risposte

                                Luca73
                                Luca73 - 624 risposte