Invio Mail con EXCEL



  • Invio Mail con EXCEL
    di Francesco (utente non iscritto) data: 04/10/2012 20:42:20

    Ciao ragazzi

    ho trovato questa macro in rete che fa al caso mio ma volevo sapere se è possibile :
    - inviare solo il foglio attivo
    oppure
    - aprire una finestra dialogo che ti permetta selezionare file da allegare.

    penso che si debba modificare "Attachments.Add" ma non ci sono riuscito
     
    Sub Invioemail()
        Dim OutApp As Object
        Dim OutMail As Object
        Dim EmailAddr As String
        Dim Subj As String
        Dim BodyText As String
    
        EmailAddr = Range("i2").Value  '<<< inserire  indirizzi
        Subj = "nota n° " & Range("j4") & " del " & Range("j6").Value
    
        BodyText = "In allegato ."
    
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(0)
    
        With OutMail
        .to = EmailAddr
        .CC = ""
        .BCC = ""
        .Subject = Subj
        .Body = BodyText
        .Attachments.Add ActiveWorkbook.FullName 'inserisce il file excel in allegato
        .Display 'or use .send
        End With
    
        Set OutMail = Nothing
        Set OutApp = Nothing
        End Sub



  • di Vecchio Frac data: 04/10/2012 21:34:59

    Il codice è perfetto, è praticamente simile a quello che uso io in altri contesti e per altri scopi.
    Per rispondere alle domande, rifletti: puoi in una mail allegare solo *un singolo* foglio? direi di no, a me non risulta. Quindi devi inviare tutto il file, oppure un suo estratto: creare una copia della cartella di lavoro con il solo foglio che ti interessa.

    Sull'aprire una finestra di dialogo per la scelta di un file hai diverse scelte:
    - Application.FileDialog(msoFileDialogOpen).Show
    - Application.GetOpenFilename

    Ti rinvio alla Guida per le differenze e l'uso dei due comandi.

    Ovviamente .Attachments.Add è corretto (quindi prima assegni a una variabile stringa il risultato dell'apertura della finestra di selezione file e poi metti tale variabile dopo .Attachments.Add).





  • di Vecchio Frac data: 04/10/2012 21:39:14

    Dimenticavo che puoi anche usare Application.SendMail.
    Questo comando spedisce la cartella di lavoro aperta tramite il sistema di posta elettronica installato.
    Nella Guida l'esempio dice:
    ActiveWorkbook.SendMail recipients:="Jean Selva"

    Non sono previsti allegati, quindi prima apri il file da spedire (altro comando utile in alternativa a quelli già detti: Application.FindFile) e poi lo spedisci con Application.SendMail.
    Ovviamente questo semplifica moltissimo il codice e il lavoro, perchè non devi creare alcuna istanza di Outlook (ci pensa Excel a inviare il file mediante il sistema di posta installato sul sistema), ma ha naturalmente qualche limitazione proprio in quanto semplifica le operazioni.






  • di Francesco (utente non iscritto) data: 04/10/2012 22:25:25

    Grazie per aiuto!!
    (sono 3 settimane che pasticcio con il vba) apprezzo che mi inviti a ragionare sui suoi meccanismi

    ho risolto per il momento seguendo il tuo consigio di usare una variabile stringa.



  • di Francesco (utente non iscritto) data: 04/10/2012 22:27:51

    Per curiosità se volessi invece di imparare strada facendo il necessario avvicinarmi in maniera più metodica alla programmazione vba che guida o manuale mi consiglieresti?
    in rete si trova di tutto e ad un inesperto in libreria i libri sembrano tutti uguali.



  • di Vecchio Frac data: 05/10/2012 08:18:47

    L'unico consiglio valido che posso darti è smanettare, fare pratica, provare e aiutarti sia con la Guida che con Google. La maggior parte dei siti validi sono in inglese, ma ci sono molti forum validi... come questo ;)
    Io non ti consiglio nessun libro particolare perchè non ne conosco... la mia esperienza personale è fatta di prove, tentativi ed errori (e copiatura del codice altrui... copiare in informatica non è peccato, si chiama riuso! ^_^)
    Nella Home di questo Forum trovi dei link con collegamenti a risorse per alcuni approfondimenti.





  • Stampa con Excel
    di GIUS (utente non iscritto) data: 05/10/2012 11:38:03

    ho trovato un' articolo interessante che fa al tuo caso su: //forum.wintricks.it/showthread.php?t=155317



  • di Francesco (utente non iscritto) data: 05/10/2012 13:04:02

    Grazie mille

    e che smanettare sia allora



  • di Francesco (utente non iscritto) data: 16/10/2012 22:37:35

    qualcuno sa come inserire una porzione di foglio nel corpo della mai

    inserisco in BodyText = " " il valore di una cella o piu cella ma non riesco ad inserire un range tipo : range("a1;a10")

    il codice che utilizzo è quello pubblicato qualche tempo fa!
    qualche dritta?

    ho provato anche assegnado ad una variabile X il range e scrivere
    BodyText = X
    ma nulla



  • di Vecchio Frac data: 17/10/2012 09:10:25

    Devi scorrere il range cella per cella, recuperarne il contenuto, metterlo in una variabile, infine assegnare il body alla variabile.


     
    'Recupera il contenuto delle due celle A1 e A10 e lo mette in some_text con un ritorno a capo
    'poi assegna al corpo dell'email questo testo
    for each v in [A1,A10]
        some_text = v & vbCrLf
    next
    OutMail.Body = some_text






  • di Francesco (utente non iscritto) data: 17/10/2012 19:33:34

    Ho provato il tuo frammento di codice e mi restituisce solo il valore dell'ultima cella.




    (a proposito grazie al tuo aiuto ed a quello di Harry ho fatto qualcosina :
    - Somma valori in base alla formattazione totale e parziali
    - conteggio righe con stessi valori
    sono sciocchezzuole ma se non altro adesso stabilisco un range organizzo un ciclo.)




  • di Francesco (utente non iscritto) data: 17/10/2012 19:35:26

    dimenticavo : ciclo per estrarre una parte dei una stringa in un range ^_^

    voi vate tutto in qualche secondo io ci metto ... bhe un pochino di più ma almeno comincio ad arrangiarmi!



  • di Vecchio Frac data: 17/10/2012 20:44:04

    Mamma mia che stupido, hai ragione, chiedo perdono :)

    Naturalmente ad ogni ciclo il valore accumulatosi in some_:text non deve perdersi!
    Correggi come segue:

    some_text = some_text & v & vbCrLf





  • di Francesco (utente non iscritto) data: 17/10/2012 20:49:15

    MA stupido proriono no!!! è lo stesso concetto della somma

    tot = tot + valore

    potevo arrivarci anche io !!!!!!!

    (in vba mi piacerebbe essere stupido come te)



  • di Vecchio Frac data: 17/10/2012 20:58:49

    LOL ^_^
    Sì, è lo stesso concetto, che però in matematica non ha senso...

    a = a + 1
    Se lo scrivevo al liceo mi prendevo quattro :)
    In realtà qui l'uguale non è un segno di uguaglianza ma di assegnazione (e non per niente in altri linguaggi ci sono simboli diversi per queste due operazioni). Però se te ne dimentichi non si solleva alcun errore... perchè è un errore di logica, non di sintassi, e sono gli errori più subdoli. Tutto funziona ma non ottieni il risultato che ti aspetti!
    Comunque ci sono millanta cose che non so e che vorrei imparare... ad esempio sui nuovi Word, Excel e compagnia cantante.





  • di Francesco (utente non iscritto) data: 17/10/2012 21:13:54

    Fatto bene a puntualizzare.

    lo scopo di questo forum è proprio quello di imparare da zero o ampliare le proprie conoscenze .
    Spero che con le mie richieste e puntualizzazioni abbia contribuito.
    Per quanto mi riguarda per me è stato e continua ad essere cosi ^_^
    (non solo in vba)



  • di Francesco (utente non iscritto) data: 19/10/2012 14:45:56

    Ciao di nuovo qui:

    la diritta che mi hai dato ovviamente è giusta.

    ho stabilito il range purtroppo però il risultato non mi soddisfa in quanto vorrei che rispettasse l' ordine delle cella del foglio: insererisse nel foglio la tutte le righe andando a capo riga per riga e non cella per cella.
    es:range(" A1 :D1")
    Ciao Francesco come va?

    NON
    ciao
    Francesco
    come
    va?

    Ho provato con entirerows.copy ecc ma non ci riesco
    Suggerimenti?
     
     With Sheets("Foglio1")
         ur = .Cells(Rows.Count, 1).End(xlUp).Row
                Set rng = Range(.Cells(1, 1), .Cells(ur, 5))
        With OutMail
        For Each v In rng
    
        some_text = some_text & v & vbCrLf
    
      Next



  • di Vecchio Frac data: 19/10/2012 15:16:21

    Bè, se ti disturba veder andare a capo le parole, individua anzitutto cosa fa andare a capo la stringa :)
    L'unica cosa strana è "vbCrLf" che è una costante composta dai caratteri speciali "ritorno a capo e nuova riga". Sostituiscila con uno spazio vuoto e vedrai le celle del tuo range concatenarsi. Poichè vuoi che alla fine della riga si vada comunque a capo, questo lo farai controllando che la colonna attuale sia la quinta (perchè hai stabilito che "rng" è definito da A a E).
    Ci sarebbe una forma più concisa, con IIf, ma non voglio confonderti le idee adesso.
     
    For Each v In rng
        some_text = some_text & v & " "      '<-- c'è uno spazio vuoto tra le virgolette!
        if v.Column = 5 then some_text = some_text & vbCrLf     '<-- dopo la quinta colonna andiamo a capo
    Next
    






  • di Francesco (utente non iscritto) data: 19/10/2012 16:31:42

    " farai controllando che la colonna attuale sia la quinta (perchè hai stabilito che "rng" è definito da A a E)." - questo è esattamente ciò che mi mancava.

    il "vbCrLf" lo conoscevo

    Grande direi



  • di Vecchio Frac data: 19/10/2012 16:33:53

    :D
    Allora sei pronto per confonderti le idee.
    Qui sotto ottengo lo stesso risultato ma risparmio una riga di codice (e ne aumento la illeggibilità).
     
    For Each v In rng
        some_text = some_text & v & IIf(v.Column = 5, vbCrLf, " ")
    Next






  • di Francesco (utente non iscritto) data: 19/10/2012 17:49:19

    Pronto prontissimo!!

    (tra altro il risultato ottenuto è giustissimo ma la leggibilità scarsa cosi ho modificato il codice e non ho più bisogno di aprire finestra per allegato:
    - macro per esportare pdf
    - percorso file per allegare in automatico pdf esportato

    cosi ho invio automatico mail ^_^

    Sono soddisfatto
     
    Sub esportapdf()
     
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:Nota Accredito.pdf", Quality:= _
            xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
    End Sub
     NELLA MACRO MAIL
    
    .Attachments.Add "C:Nota Accredito.pdf"
    



  • di Francesco (utente non iscritto) data: 19/10/2012 17:59:59

    guarda come studio ^_^

    È possibile utilizzare la funzione IIf ovunque sia possibile utilizzare le espressioni. La funzione IIf consente di determinare se un'altra espressione è True o False. Se l'espressione è True, IIf restituirà un valore; se è False, IIf restituirà un altro valore. I valori restituiti da IIf vengono specificati dall'utente in base a valore true inserito o false (ultima riga aggiunta io ^_^)



  • di Vecchio Frac data: 19/10/2012 18:44:53

    Benissimo.
    Dai per curiosità un'occhiata anche a Choose e Switch :)
    In qualche situazione potranno tornarti utili.





  • di Francesco (utente non iscritto) data: 20/10/2012 17:37:25

    Fatto !!! ^_^