› Excel e gli applicativi Microsoft Office › Invio foglio attivo ad una email diversa (Excel 2016)
-
AutoreArticoli
-
Ciao a tutti
spero che possiate aiutarmi col mio problema..
La macro che ho inserito nell'editor del foglio interessato mi trasforma il foglio attivo in pdf e lo invia all'email che è contenuta nella cella D3 (sempre nello stesso foglio).
Ora, arrivo al punto, avrei la necessità di inviare il file pdf che ho creato precedentemente ad un altro indirizzo email sempre contenuta nella cella D3 (cambiando indirizzo email).
Sarebbe possibile fare ciò? (Ad entrambe le macro ho associato un pulsante proprio: la prima macro che mi salva il file pdf e successivamente lo invia, e la seconda che invia una email con testo).
Vi ringrazio anticipatamente per il vostro aiuto e spero di aver spiegato bene..
Di seguito vi posto i codici che uso:
Sub MailFoglioAttivoInPDF() Dim OutApp As Object Dim OutMail As Object Dim v As Variant Dim StrMsg As String StrMsg = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd' >" StrMsg = StrMsg & "<html xmlns='http://www.w3.org/1999/xhtml'>" StrMsg = StrMsg & "<body>" StrMsg = StrMsg & _ "
Buongiorno,</br>
</b></br></body></html>" MailDestinatario = Range("D3") v = Application.GetSaveAsFilename(Range("A1").Value & "" & Range("B1").Value & "" & Range("C1").Value & " " & Range("D1").Value, "PDF Files (*.pdf), *.pdf") If VarType(v) <> vbString Then Exit Sub With ActiveSheet .ExportAsFixedFormat Type:=xlTypePDF, Filename:=v, _ Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, From:=1, To:=3, OpenAfterPublish:=False End With Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .To = MailDestinatario .Subject = "Documenti" .HTMLBody = StrMsg .Attachments.Add v .Display '.Send End With On Error GoTo 0 Set OutMail = Nothing Set OutApp = Nothing With Application .ScreenUpdating = True .EnableEvents = True End With End Sub ------------------------------------------------------------------ Sub InviaEmail() Dim OutApp As Object Dim OutMail As Object Dim StrMsg As String StrMsg = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd' >" StrMsg = StrMsg & "<html xmlns='http://www.w3.org/1999/xhtml'>" StrMsg = StrMsg & "<body>" StrMsg = StrMsg & _ "
" & _ "di seguito le allego il documento richiesto.
" & _ "
<b>Buona giornataCiao, questa è una prova di una e-mail
</body></html>" Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) MailDestinatario = Range("D3") With OutMail .To = MailDestinatario .Subject = "Invio di prova" .HTMLBody = StrMsg .Display '.Send End With End SubPoiché, come ti accorgi, hai duplicato il codice per inviare la mail, scrivilo una volta soltanto e richiamalo.
In pratica ti servono due funzioni: una per creare il pdf dal foglio attivo e una per inviare una mail.
Guardando il codice non ho capito che problema è sorto, mi sembra tutto corretto (a parte che ti consiglio di inserire Option Explicit in testa al modulo). Ed è anche scritto bene, bravo 🙂 (però devi dichiarare MailDestinatario, che manca)
Carino l'uso di GetSaveAsFilename, non si vede spesso
Ciao vecchio frac, ti ringrazio della risposta e scusami se rispondo ora. Sinceramente non ho ben capito cosa vorresti dire. Nel senso che la prima macro va bene e nella seconda devo richiamare la prima? Chiedo perchè alla seconda macro vorrei che in allegato ci fosse il pdf che ho creato prima, in quanto poi il destinatario sarà diverso dal precedente.
Ti prego di perdonarmi perchè in questi ultimi 3 mesi sto iniziando a masticare il VBA ed alcune cose, soprattutto le più ovvie non mi vengono.
Allegati:
You must be logged in to view attached files.Sinceramente non ho ben capito cosa vorresti dire.
Niente di inafferrabile: ti servono due attività (crea pdf e spedisci mail), quindi devi creare due funzioni. Attualmente hai creato una funzione che le utilizza entrambe, più una separata (l'invio della mail) che fa la stessa cosa della prima, quindi è logico pensare di tenerle separate e richiamarle quando servono. Se poi aggiungi al tuo bagaglio l'informazione che una funzione può ricevere un parametro (in questo caso, il nome del file da allegare), capisci che il risparmio di codice è notevole.
Quindi lo scheletro dell'algoritmo è questo:
- funzione CreaPDF(): dal foglio attivo crea il PDF; richiama la funzione InviaMail(filePDF). - funzione InviaMail(parametro opzionale: nome_file_da_allegare): crea gli ogegtti Outlook necessari per l'automazione; prepara il testo della mail; è stato specificato un file_da_allegare? sì ---> allega il file, poi prosegui: no ---> visualizza messaggio (oppure invialo direttamente)
Tu hai già fatto praticamente tutto, devi solo capire concettualmente (e implementarla) questa cosa del passaggio di parametro 🙂
Ciao vecchio frac e grazie per aver risposto.
Ho capito cosa vorresti dire (farò delle prove per arrivarci al risultato desiderato) solo che in questo caso, all'apertura del file attivo, il nome con cui salverà il file con l'estensione .pdf cambierà ed ogni volta dovrei cambiare il parametro. (o sbaglio?) Non ci sarebbe un modo per automatizzare il tutto?
Comunque adesso mi metto a studiare questa cosa e ci sbatterò un po con la mia testa (so che le due funzioni fanno entrambe la stessa cosa, solo che la prima invia il pdf (come allegato, senza andarlo a cercare) creato all'email predefinita in D3 (con la stessa email nel documento pdf, come tipo fattura), invece la seconda dovrà inviare l'allegato precedente (senza andarlo a cercare) ad un'altra email senza che questa venga trasformata in pdf, quindi mi servono entrambe). Ti ringrazio infinitamente per l'aiuto, ti farò sapere se riuscirò nell'impresa
il nome con cui salverà il file con l'estensione .pdf cambierà
Lo scopo di una funzione con parametro è che puoi invocarla passando il parametro valorizzato diversamente, ogni volta che ti serve. Quindi sì, devi passare un parametro diverso ed è questa l'automazione che ti serve.
la seconda dovrà inviare l'allegato precedente ad un'altra email senza che venga trasformata in pdf
Ma l'allegato precedente non è già un pdf?
Sì, certo è già un pdf.
La prima macro va bene così come sta (per l'uso che ne devo fare va benissimo), nella seconda macro dovrei inserire il parametro che richiami la prima macro (che a sua volta richiami il file pdf), senza che ogni volta che apre outlook devo andare in "c:/documenti ecc.." prendere il file pdf e poi cliccare su invia.. questa sarebbe la mia intenzione..
Io credo di non essere riuscito a spiegarmi bene. Perciò ho rivisto il tuo ultimo file e ho riscritto il codice perchè faccia quello che mi sembra di aver capito che tu voglia fare.
Analizza bene il file allegato e dimmi se così va bene oppure no. A volte un esempio aiuta più delle parole 🙂
Chiaramente devi capire come funziona e poi ti sarà chiaro cosa devi modificare.
Allegati:
You must be logged in to view attached files.Grazie mille, praticamente hai semplificato la mia prima macro adesso cercherò di capire come allegare il pdf alla seconda macro. Ti farò sapere nei prossimi giorni
Ciao
io ti consiglierei, anzichè scrivere un'altra macro, ti creare un ciclo Do ... loop
del tipo qui sotto
Sono partito dal file di VF e chiaramente dovrai modificare la definizione del destinatario.
Se sai sempre che devi inviarne 2 invece farei un ciclo for ... next
Do Set OutMail = OutApp.CreateItem(0) With OutMail .To = destinatario .Subject = oggetto .HTMLBody = StrMsg If allegato <> "" Then .Attachments.Add allegato .Display '.Send End With UnAltro = MsgBox("Ne Vuoi Spedire un Altro?", vbYesNo + vbQuestion, "ALTRO?") Loop Until UnAltro = vbNo
Io mi sono chiesto anche se deve allegare più di un file. In tal caso il codice va aggiustato 🙂
Eccomi di nuovo ahahah..
vecchio frac ho trovato la soluzione al mio problema , ho semplicemente duplicato la parte relativa all'invio dell'email, ho fatto la prova ed la invia ad entrambe.. ti ringrazio tantissimo e ringrazio anche Luca73.. Grazie mille ad entrambi
Vi posto il codice finito se in caso qualcuno ne avesse bisogno:
`Sub MailFoglioAttivoInPDF() Dim OutApp As Object Dim OutMail As Object Dim v As Variant Dim StrMsg As String StrMsg = "" StrMsg = StrMsg & "" StrMsg = StrMsg & "" StrMsg = StrMsg & _ "Buongiorno," & _ "di seguito le allego il documento richiesto." & _ "Buona giornata" MailDestinatario = Range("D3") v = Join(Application.Transpose(Application.Transpose(Range("a1:d1"))), "") If VarType(v) <> vbString Then Exit Sub With ActiveSheet .ExportAsFixedFormat Type:=xlTypePDF, Filename:=v, _ Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, From:=1, To:=3, OpenAfterPublish:=False End With Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .To = MailDestinatario .Subject = "Documenti" .HTMLBody = StrMsg .Attachments.Add v .Display '.Send End With MailDestinatario2 = Range("D4") StrMsg = "" StrMsg = StrMsg & "" StrMsg = StrMsg & "" StrMsg = StrMsg & _ "Buongiorno," Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .To = MailDestinatario2 .Subject = "Documenti" .HTMLBody = StrMsg .Attachments.Add v .Display '.Send End With On Error GoTo 0 Set OutMail = Nothing Set OutApp = Nothing With Application .ScreenUpdating = True .EnableEvents = True End With End Sub `
ho semplicemente duplicato la parte relativa all'invio dell'email
Terribile. Proprio quello che non dovevi fare 😛
ho trovato la soluzione al mio problema
però ce l'hai fatta da solo, e questo giustifica il tuo entusiasmo
-
AutoreArticoli