Mandare email di determinate celle di un database di magazzino

di il
26 risposte

26 Risposte - Pagina 2

  • Re: Mandare email di determinate celle di un database di magazzino

    Allora cominciamo con l'analizzare e correggere il codice che hai fatto:

    Dove tu hai Scritto:
    Dim NewMail As Object
    Set NewMail = CreateObject("Outlook.Application").CreateItem(oMailItem)
    Io Scriverei:
    Dim OutApp As Object
    Dim NewMail As Object
        
    Set OutApp = CreateObject("Outlook.Application")
    Set NewMail = OutApp.CreateItem(oMailItem)
    Infatti credo sia meglio gestire separatamente gli oggetti istanziati... ma non avevi fatto comunque un errore…

    Nota tecnica:
    Normalmente quando si scrive codice di automazione si inizia con l'Early Binding ed infine si termina con il Late Binding… ho notato che hai scritto direttamente in Late Binding (il primo ti permette di sfruttare l'intellisense ma richiede l'inserimento dei riferimenti - il secondo non espone l'intellisense ma non necessita dei riferimenti)… se non sai cosa sono Early Binding, LAte Binding e intellisense puoi cercarli su google se ti va… non è strettamente necessario alla risoluzione del tuo problema).

    Poi proseguivi con:
        With NewMail
            .To = Worksheets("il mio foglio excel che si chiama Orders").Range("qui non so cosa mettere")
            .Subject = "Invio di prova"
            .Body = "qui dovrebbe apparire come corpo del messaggio le celle corrispondenti alla cella con valore 0 quando essa cambia"
            Destin = "a.pippo@dominio.it"
            ActiveWorkbook.SendMail Recipients:=Destin, Subject:="Ciao"
            .Send
        End With
    che tutto sommato potrebbe andare bene ma "ActiveWorkbook.SendMail Recipients:=Destin, Subject:="Ciao"" e Destin = "" non c'entrano nulla quindi:
        With NewMail
            .Display
            .To = ""
            .CC = ""
            .Subject = "OGGETTO DELLA MAIL"
            .HTMLBody = "Corpo della mail" 'CreaCorpoEmail()
            .Display
            '.Send
        End With
    In particolare:
    .To = conterrà il valore delle celle G1 e G2 del foglio excel che mi hai indicato separate dal punto e vergola se inseriti entrambi. Sai come prelevare il valore di una cella da Excel? (Suggerimnto: in maniera molto simile a come avevi scritto tu nel tuo codice iniziale ma devi accedere alla proprietà "value" ovvero Worksheets("Orders").Range("G1").value & "; " & Worksheets("Orders").Range("G2").value (quindi con un semplice if else puoi disciplinare la presenza di 1 o 2 indirizzi destinatario;
    .CC = sarebbe il classico "destinatario per conoscenza" se non ti serve levalo;
    .HTMLBody l'ho sostituito a .Body perché per quello che vuoi fare credo sia più indicato un corpo HTML al posto di quello classico con solo testo. Inoltre dopo "Corpo della mail" ho aggiunto un commento "'CreaCorpoMail" che in realtà poi andrà immediatamente dopo il segno di uguale ad indicare che servirà una funzione che legga le righe del file Excel, le trasformi in codice HTML e il risultato ottenuto lo mette nel HTMLBody.
    .Display=Ti serve per vedere come viene la mail prima di essere trasmessa... quando avrai appurato che il format ottenuto ti soddisfa potrai cancellarlo
    .Send l'ho flaggato perché ovviamente per ora la mail non deve essere trasmessa ma solo controllata a video per verificare che sia tutto esatto... quando tutto sarà finito potrai deflaggarla.

    Infine consa che non avevi fatto concluderei con un bel:
    Set OutApp = Nothing
        Set NewMail = Nothing
    che serve per liberare la memoria inizialmente allocata per ospitare gli oggetti creati a inizio codice.
    Non ho fatto nient'altro che modificare e correggere quello che hai fatto tu spiegandoti cosa secondo me andava rivisitato…

    Come ti avevo anticipato per creare il codice HTML da inserire in HTMLBody serve altro codice che per chiarezza ho preferito gestire separatamente in un'altra funzione:
    Function CreaCorpoEmail() As String
        Dim strbody As String
        Dim i As Integer
        
        strbody = strbody & "<html>"
        strbody = strbody & "<b>TITOLO EMAIL</b><br>"
        strbody = strbody & "<p><b><font color='red'>TESTO DI COLORE ROSSO</font></b></p>"
        strbody = strbody & "<body>"
        strbody = strbody & "<table border='1'>"
        strbody = strbody & "<tr>"
        strbody = strbody & "<td>INTESTAZIONE1</td><td>INTESTAZIONE2</td><td>INTESTAZIONE3</td><td>INTESTAZIONE4</td>"
        strbody = strbody & "</tr>"
        
        For i = 0 To 19
            strbody = strbody & "<tr>"
            strbody = strbody & "<td>CELLA1</td><td>CELLA2</td><td>CELLA3</td><td>CELLA4</td>"
            strbody = strbody & "</tr>"
        Next
        
        strbody = strbody & "</table>"
        strbody = strbody & "</body>"
        strbody = strbody & "</html>"
        CreaCorpoEmail = strbody
    End Function
    Se conosci un po di sintassi HTML non dovresti avere difficoltà ad interpretare il codice HTML memorizzato nella stringa strbody... si tratta di una pagina HTML semplice con una tabella di 21 righe e 4 colonne (la prima è l'intestazione).. ovviamente è solo per farti vedere cosa esce… ora rimane da prelevare il contenuto dal foglio Excel così da riempire la tabella con i dati reali…

    Se hai notato sto cercando di evitare il codice pronto da copia e incolla perché mi piace l'idea di trasmettere qualcosa a chi chiede aiuto.

    Prova a mettere insieme il tutto così da darmi conferma che vedi effettivamente apparire la mail con le 21 righe di codice HTML senza ricevere errori.. e se riesci potresti anche provare a prelevare qualcosa dal foglio Excel per sostituirlo al testo (cominciando dall'intestazione ad esempio)...
  • Re: Mandare email di determinate celle di un database di magazzino

    Ciao Angelo,

    spiegazione eccellente dei miei errori, ti ringrazio perche cosi mi permetti di capire e apprendere. Fino alla correzione della prima parte del codice ti ho seguito abbastanza bene.
    La seconda parte che riguarda il corpo dell'email e' un po piu complicata in quanto non conosco le sintassi HTML ma avevo gia letto alcune spiegazioni in merito. Me le vado a studiare e provo a mettere insieme il tutto e vediamo cosa esce fuori.
    Ti ringrazio moltissimo, per ora, per non avermi dato una pappa pronta, molti lo fanno senza spiegare ma cosi uno non impara mai.
    Da domani sono in ferie e ritorno a lavoro Martedi prossimo. Quindi, per non "rovinarmi" (ahahahaha) le vacanze lo provero' Martedi e ti faccio sapere.

    Sei stato super gentile nell'aiutarmi. Spero di essere all'altezza delle tue (e anche mie) aspettative.
    Per ora buon proseguo di tutto a risentirci presto ciao
  • Re: Mandare email di determinate celle di un database di magazzino

    Ciao Angelo,
    eccomi di ritorno dalla mia mini vacanza.
    Mi sono studiato la sintassi html e ho capito perfettamente come inserire tutti i dati della tabella. Non ho avuto tempo di configurare aoutlook ma sono sicuro che funziona tutto.
    L'unica cosa che sto cercando di capire e' come fare in modo che queste emails partano in maniera automatica quando le celle del nuovo foglio si popolano, ovvero quanto la cella J del foglio oridini diventa zero. Visto che sono ordini di materiale, una volta completati gli ordini, ovvero quando il materiale arriva a destinazione, la riga verra cancellata e ne saranno scritte delle altre. Quindi la email che viene mandata cambia di volta in volta e man mano che si popolano o ri-popolano le celle.
    Se mi sai indirizzare dove andare a vedere o cosa studiare per fare questo te ne sarei grato.

    Grazie mille per il tuo aiuto fin qui datomi.
  • Re: Mandare email di determinate celle di un database di magazzino

    Buongiorno e ben tornato. Quello che c'è da chiedersi è quali sono gli eventi che danno luogo all'invio automatico delle email?
    La pressione di un tasto dopo il riscontro ottico di un utente del programma? Il settaggio di un orario specifico giornaliero/settimanale nel quale, dopo il riscontro, vengono mandate le mail? Quante mail per i diversi stati dell'ordine hai previsto vengano inviate, una sola mail quando vi sono dellec rghe in cui j e 0 e basta? Quando viene inviata la mail perché le righe della colonna J hanno dei valori a 0 deve anche cancellarle immediatamente? E se non le cancella immediatamente come fare a discriminarle in caso di invio di nuove mail perché si sono aggiunto nuovi ordini?

    In sostanza puoi spiegarmi per bene i criteri e le azioni che prevedi in relazione all'invio delle mail? I'm confused!

    A presto.
  • Re: Mandare email di determinate celle di un database di magazzino

    Angelo_Tbp ha scritto:


    Buongiorno e ben tornato. Quello che c'è da chiedersi è quali sono gli eventi che danno luogo all'invio automatico delle email?
    La pressione di un tasto dopo il riscontro ottico di un utente del programma? Il settaggio di un orario specifico giornaliero/settimanale nel quale, dopo il riscontro, vengono mandate le mail? Quante mail per i diversi stati dell'ordine hai previsto vengano inviate, una sola mail quando vi sono dellec rghe in cui j e 0 e basta? Quando viene inviata la mail perché le righe della colonna J hanno dei valori a 0 deve anche cancellarle immediatamente? E se non le cancella immediatamente come fare a discriminarle in caso di invio di nuove mail perché si sono aggiunto nuovi ordini?

    In sostanza puoi spiegarmi per bene i criteri e le azioni che prevedi in relazione all'invio delle mail? I'm confused!

    A presto.
    Eccomi Angelo scusa il ritardo ma sono stato pieno di lavoro.
    Ok cerco di spiegare quello che mi serve.
    Io emetto degli ordini per materiale. Scrivo quindi nella foglio ordini di Excel in ogni cella un dato diverso. Per comodita chiamaero Cella1, Cella2 ecc
    Quindi in Cella1 il codice del materiale da ordinare, in Cella2 la data dell'ordine, in Cella3 la quantita ordinata e in Cella4 la quantita spedita.
    Solo e quando nella Cella5 (che e' la sottrazione matematica tra la Cella3 e 4) la quantita e uguale a zero io so che l'ordine e' concluso. In questa circostanza ho bisogno che mi parta in automatico la email con il contenuto di tutta questa riga, ovvero dalla Cella1 alla Cella4. Cosi posso tenere traccia di quello che i miei dipendenti stanno facendo e che tutto e' corretto. Inoltre e' una traccia che mi rimane nella mia casella postale nel caso di siano delle discrepanze nel quantitativo di materiale arrivato.
    Quindi ovviamente ci saranno piu righe simili a questa, ma come ti dicevo in precedenza non credo di superare mai i 20 ordini giornalieri.
    Probabile che poi queste informazioni scritte degli ordini dopo un po di tempo (forse 1 giorno o 1 settimana al massimo) vengano cancellate e si riscriveranno nuoi ordini e nuove informazioni. Quindi ci saranno N numeri di righe dove si scriveranno le informazioni degli ordini che vanno sempre dalla Cella 1 alla 4.

    Quindi per riassumere, ogni qualvolta che la macro (o quello che sia) vede che nella Cella5 (che corrisponde alla mia cella J) delle varie riche (per comodita diciamo dalla riga 1 alla 20) sia uguale a 0 deve partire la mail automatica.

    Spero questa volta di essere stato un po piu chiaro.
    Certo che se io trovassi il modo di inviarti il file capiresti immediatamente, perche e' piu facile a vederlo che a scriverlo.

    Grazie mille
  • Re: Mandare email di determinate celle di un database di magazzino

    Rieccomi. Penso di aver capito bene come è fatto il file Excel almeno nelle sue parti essenziali altrimenti non avremmo potuto fare quello che abbiamo fatto fino ad adesso. Prima di passare al problema tecnico c'è da affrontare quello logico.

    Cerco di spiegarmi meglio con un esempio.
    - Supponiamo che oggi 28/05/2020 hai 15 righe in cui nella colonna J hai il valore 0;
    - Questo produrrà nel foglio aggregatore 15 righe che dovrebbero essere mandate via email;

    Problema logico nr 1 Se mandi una mail che riporta i dati relativi alle 15 righe immagino sia necessario che le righe vengano immediatamente cancellate o messe in uno stato che impedisca alla mail successiva (magari mandata il giorno dopo) di trasmettere nuovamente gli stessi dati già inviati assieme ai nuovi. E questo è un problema di logica.. come vuoi gestire la cosa? Vuoi Cancellare le righe subito? Vuoi mettere le righe in uno stato in cui la mail successiva non le consideri fintanto che non le hai ancora cancellate? (mi hai scritto infatti...

    Giangi79 ha scritto:


    ---Probabile che poi queste informazioni scritte degli ordini dopo un po di tempo (forse 1 giorno o 1 settimana al massimo) vengano cancellate e si riscriveranno nuovi ordini e nuove informazioni...
    ...e se poi mandi un'altra mail prima di cancellare le vecchie, o senza averle contrassegnate in modo che il programma non le rilevi, rischi che vengano di nuovo considerate.

    Problema logico nr 2 Devi definire meglio cosa intendi per "invio automatico" il computer è una macchina che per effettuare delle operazioni ha bisogno di istruzioni precise e di criteri in base ai quali esse devono essere eseguite.
    - Come immagini l'automatismo legato all'invio delle mail? Esempio: Apri il file Excel e ti esce una finestra che dice "sono state individuate nr. 10 righe da trasmettere. Vuoi procedere all'invio?" oppure prevedi che "in automatico" il file si apra e le mail vengano inviate senza la supervisione di alcun essere umano quindi con una sorta di timer ad intervalli regolari?

    "In automatico" significa tutto e niente.. ed ecco il perché di tutte le mie domande.. probabilmente tu hai ben chiaro in testa cosa vorresti ottenere ma se rileggi bene quello che mi hai scritto fino ad adesso ci sono dei vuoti che lasciano un ventaglio di scelte troppo ampio… ed il programma è tuo e non voglio condizionarti.. a meno che non sia tu a volerlo… in tal caso se fossi io a dover decidere probabilmente deciderei di:
    1) inviare le mail solo quando apro il programma Excel;
    2) premo un pulsante che mi dice se vi sono email da inviare;
    3)immediatamente metto le righe in uno stato che fa capire che sono state trasmesse* oppure le cancello** oppure ***
    4) Visualizzo a schermo la mail precompilata evitando l'invio automatico (meglio non rischiare di mandare informazioni sbagliate se il programma dovesse funzionare male...)…

    *Se sono al massimo 20 righe al giorno potresti intervenire manualmente mettendo una x in una colonna aggiuntiva del foglio ordini per poi modificare il foglio aggregatore in modo che non ti metta in elenco le righe che in j hanno 0 e nella colonna aggiuntiva una x.
    ** le cancello e non devo aggiungere alcuna colonna.
    ***In alternativa a * e ** si potrebbe scrivere un automatismo VBA ma capisci bene che "intercettare" le righe con j a 0 e mettere in corrispondenza una X in una altra colonna della stessa riga potrebbe non esser semplicissimo… oppure no?


    I punti sopra sono un esempio delle operazioni da eseguire e di criteri in base alle quali esse vengono svolte... Se hai altro in mente cerca di seguire una linea guida del genere... magari sono io a non aver capito quello che mi hai scritto
  • Re: Mandare email di determinate celle di un database di magazzino

    Ciao Angelo, scusami se rispondo solo ora ma sono stato pieno di lavoro.

    Per rispondere alle tue domande logiche sono riuscito a inviare (spero ti arrivi) uno screen shot di quello che fa il foglio degli ordini.

    Per il problema logico n 2 … "invio automatico" intendo che ogni volta che si conclude un ordine e quindi la Colonna J diventa 0 (come nell'esempio del primo ordine) dovrebbe partire la mail con la riga corrispondente. Poi, come il secondo ordine della riga successiva si completa e quindi la Colonna J diventa di nuovo 0 dovrebbe partire un altra mail con questa nuova riga. E per rispondere al problema logico n 1 per me non e' importante se nella seconda mail si ripeta anche la riga presente nella prima mail, per me non e' assolutamente un problema se questo aiuta a facilitare il processo.
    Quindi per automatico intendo uno script dentro del codice della email o qualcosa del genre che riesca a capire quando inviare la mail senza l'intervento di un operatore umano. Ora ovviamente non so se questo sia fattibile praticamente, altrimenti dovro ristudiarmi la situazione e optare per una soluzione differente.

    Spero questa volta di essermi spiegato un tantino meglio. Grazie per la tua pazienza e diaponibilita, lo apprezzo molto.
    Allegati:
    28734_f721b18da9f625f57d945ab8f6d287f9.jpg
    28734_f721b18da9f625f57d945ab8f6d287f9.jpg
  • Re: Mandare email di determinate celle di un database di magazzino

    Mi sono dimenticato di scrivere che la Colonna J nello screen shot inviato e' quella con scritto PENDING. Scusa ma ho ricontrollato solo ora l'allegato.
    Grazie
  • Re: Mandare email di determinate celle di un database di magazzino

    Ciao,
    allora partendo da ciò che mi hai detto e finendo con ciò che ho capito ti suggerirei di:
    1) Calcolare in una cella il numero delle righe presenti nel foglio di aggregazione;
    2) inserire nell'evento "change" del foglio ordini, un controllo "if" che attiva l'invio delle email solo quando il numero del punto 1 cambia in positivo (così quando cancelli non ti parte la mail);

    Se anche per te va bene, considerando il codice di esempio che ti ho fornito modificando il tuo e i suggerimenti di questo post, prova a buttare giù qualcosa e se hai difficoltà vediamo se possiamo intervenire in qualche modo… gli elementi in pratica li hai tutti o quasi… e sono tutti nei post precedenti…. sei riuscito a modificare il codice che ti ho postato?...

    Giangi79 ha scritto:


    ...
    Mi sono studiato la sintassi html e ho capito perfettamente come inserire tutti i dati della tabella. Non ho avuto tempo di configurare aoutlook ma sono sicuro che funziona tutto.
    ...
    qui hai scritto di sapere come riempire i dati della tabella… fammi vedere come hai fatto così abbiamo una base di partenza
  • Re: Mandare email di determinate celle di un database di magazzino

    Ciao Angelo, scusa se rispondo solo ora ma sono ultra pieno di impegni lavorativi questa settimana. Appena ho un attimo di tempo posto quello che sono riuscito a fare fin ora.
    Non ho capito bene il punto n.2 ... qual'e l'evento "change" di cui parli?
    Provo in giornata se mi lasciano un attimo in pace a postare il codice grazie.
  • Re: Mandare email di determinate celle di un database di magazzino

    Ciao, non preoccuparti non ci porta fretta nessuno per fortuna
    Nella finestra "Gestione dei progetti" dell'editor VBA vedrai nella cartella "Microsoft Excel Oggetti", l'elenco di tutti i fogli e, per ultimo, l'oggetto che si riferisce all'intero foglio di lavoro.
    Se accedi nel foglio in cui hai la colonna J (parlo sempre dell'editor VBA ovviamente), vedrai in alto due caselle combinate con scritto (generale) e (dichiarazioni).
    Cliccando su quella di sinistra devi accedere all'oggetto "Worksheet" e così facendo Excel ti creerà automaticamente l'evento "Worksheet_SelectionChange" associato a quel foglio… a questo punto seleziona nella casella combinata a destra l'evento "change" e cancella tutto il codice dell'intero evento ""Worksheet_SelectionChange"": non ti serve.

    L'evento change di quel foglio si scatena ogni volta che in qualsiasi cella del foglio cambi valore quindi se all'interno metti un controllo che punta alla cella con il numero delle righe totali puoi discriminare (if then else endif) l'attivazione dell'invio delle mail...
  • Re: Mandare email di determinate celle di un database di magazzino

    Ciao Angelo,

    scusa se mi faccio sentire solo ora ma ho avuto settimane di lavoro abbastanza piene piu qualche problemino fisico che mi hanno tenuto occupato. In piu ho dovuto "preparare" il database secondo le indicazioni che mi hai dato tu per poter usare la macro in questione.

    Per ora ti riporto il codice che sono riuscito a scrivere adattandolo al mio foglio excel, dimmi se vedi degli errori di sintassi per favore.
    Poi come secondo step dovro' chiederti spiegazioni sul punto 1 del tuo post del 30 Maggio.

    Spero tutto bene per te, grazie e a risentirci.

    
    
    Dim OutApp As Object
    Dim NewMail As Object
        
    Set OutApp = CreateObject("Outlook.Application")
    Set NewMail = OutApp.CreateItem(oMailItem)
        With NewMail
            .Display
            .To = "Worksheets("Orders").Range("G1").value & "; " & Worksheets("Orders").Range("G2").value"
            .CC = ""
            .Subject = "ORDERS COMPLETED"
            .HTMLBody = "Corpo della mail" 'CreaCorpoEmail()
            .Display
            '.Send
        End With
    Function CreaCorpoEmail() As String
        Dim strbody As String
        Dim i As Integer
        
        strbody = strbody & "<html>"
        strbody = strbody & "<b>ORDERS COMPLETED</b><br>"
        strbody = strbody & "<p><b><font color='red'>TESTO DI COLORE ROSSO</font></b></p>"
        strbody = strbody & "<body>"
        strbody = strbody & "<table border='1'>"
        strbody = strbody & "<tr>"
        strbody = strbody & "<td>ITEM</td><td>ORDER DATE</td><td>QUANTITY</td><td>DELIVERED</td>"
        strbody = strbody & "</tr>"
        
        For i = 0 To 19
            strbody = strbody & "<tr>"
            strbody = strbody & "<td>E5</td><td>F5</td><td>G5</td><td>H5</td>"
            strbody = strbody & "</tr>"
        Next
        
        strbody = strbody & "</table>"
        strbody = strbody & "</body>"
        strbody = strbody & "</html>"
        CreaCorpoEmail = strbody
    End Function
    
    
    
    Set OutApp = Nothing
        Set NewMail = Nothing
    
    
Devi accedere o registrarti per scrivere nel forum
26 risposte