Allora procediamo con l' invio di un allegato tipo jpg che contiene lo screenshot di una parte del foglio excel. Mi pare che l' area che vuoi inviare sia B2:K62; per prima cosa posizionerei il grafico (c' e' anche un grafico, vero?) nei dintorni di questa area, in modo da cogliere sia la parte tabellare che la larte grafica in un unica immagine. Eventualmente valuta l' ipotesi di spostare il tutto in una nuova area, priva di spazi inutili, per rendere l' immagine piu' facilmente fruibile.
Poi creati nel tuo file un nuovo foglio totalmente vuoto, e chiamalo "Scratch".
Creati poi sotto C:\ una directory (es "C:\ESITI" ) destinata a contenere tutte le immagini che creeremo e una directory (es "C:\ESITITX") per le immagini inviate (vorrei evitare il rischio che una mail il cui invio venisse non so per quale motivo ritardata trasmetta un' immagine errata, quindi le immagini saranno tutte memorizzate e le cancellerai successivamente, a mano, quando il processo sai che e' terminato).
Per creare l' immagine del foglio excel useremo il processo descritto qui:
viewtopic.php?f=26&t=77792#p441789Supponiamo che il foglio da "fotografare" si chiami Foglio1.
Abbiamo detto che memorizzeremo tante immagini, quindi dovremo usare il "nominativo" come nome file; supponiamo che il nominativo corrente si trovi in Foglio1-K1 (il nominativo con cui stai filtrando i dati), e che il nominativo non contenga caratteri incompatibili con un nome file (quindi NON CONTENGA crt quali / \ : < > | * ? ' e non so quali altri)
Direi che la seguente macro possa andare bene al tuo caso.
- Codice: Seleziona tutto
Sub convertiImm()
'
MySheet="Foglio1" '<<< Il foglio da "fotografare"
MyArea = "B2:K62" '<<< La tua area da fotografare
'
Nominat=Sheets("Foglio1").Range("K1").Value '<<< La cella dove si trova il nominativo "corrente"
'
Sheets(MySheet).activate
Range(MyArea).Select
GifLargh = Selection.Width + 10 '<<<AGGIUNTA
GifAlt = Selection.Height + 10 '<<<AGGIUNTA
Selection.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
Sheets("Scratch").Select
Dim ch As ChartObject
Set ch = Sheets("Scratch").ChartObjects.Add(1, 1, GifLargh, GifAlt)
Sheets("Scratch").ChartObjects(1).Activate
ActiveChart.ChartArea.Select
ActiveChart.Paste
OutFile="C:\ESITI\ & Nominat & "_ScrSh.jpg"
Worksheets("Scratch").ChartObjects(1) _
.Chart.Export _
Filename:=OutFile, FilterName:="JPEG"
ActiveSheet.ChartObjects(1).Delete
End Sub
Per l' invio della mail userei come base il codice da te postato qui:
viewtopic.php?f=26&t=83835#p478406 con qualche adattamento:
- Codice: Seleziona tutto
Sub Invioemail()
Dim OutApp As Object
Dim OutMail As Object
Dim EmailAddr As String
Dim Subj As String
Dim BodyText As String
'
' (a)
Set OutApp = CreateObject("Outlook.Application")
'
'compilazione di un testo standard di accompagnamento
BDT = "Ti invio il risultato delle prove effettuate."
BDT = BDT & vbCrLf & "Cordiali saluti" & vbcrLf
BDT = BDT & "Tuta"
'
' (b)
EmailAddr = "utente@dominio.it"
Subj = "Invio risultati questionario"
'
Set OutMail = OutApp.CreateItem(0)
With OutMail
.to = EmailAddr
.CC = ""
.BCC = ""
.Subject = Subj
.Body = BDT
.Attachments.Add "C:\pippo_uno.jpg" '<<< VEDI TESTO
.Display 'or use .send
.send
End With
'
' (c)
Set OutMail = Nothing
'
' (d)
Set OutApp = Nothing
End Sub
MA DA QUESTO PUNTO IN POI posso solo fare delle considerazioni, non posso cioe' suggerire la macro completa:
1) La macro InviaEmail cosi' come e' (a) apre una sessione di Outlook e crea un BodyText standard non personalizzato, (b) crea una email e la invia, (c) chiude la email corrente, (d) chiude Outlook; queste fasi sono anche identificate sul codice elecato prima.
2) Tu hai gia' sicuramente una macro che fa un ciclo di scansione dei nominativi, filtra per ognuno dei nominativi e prepara i dati personalizzati.
Il mio suggerimento e' che ti crei due macro:
A) la prima fa lo scan dei nomi e crea tutte le immagini; per questo inserirai il codice ConvertiImm all' interno della tua attuale macro. Potrai cosi' anche valutare "a occhio" la correttezza dei dati prodotti.
B) la seconda ripete lo stesso scan dei nomi e invia la mail con l' immagine come allegato. Semplificando alla grande "basta" inserire il codice di InvioEmail all' interno del codice di scan, adattando le istruzioni listate prima; in particolare
>>compili EmaiAddr in funzione del nominativo corrente
>>compili il nome dell' immagine che deve essere allegata; per questo potresti adottare le stesse istruzioni usate per nominare le immagini:
Nominat = Sheets("Foglio1").Range("K1").Value
OutFile = "C:\" & Nominat & "_ScrSh.jpg">>Usi OutFile come parametro per la definizione dell' allegato alla mail:
.Attachments.Add OutFile >> procedi con l' invio mail (il rimanente codice della sezione b e sezione c di InvioEmail)
Consiglio anche di inserire questa fase ulteriore:
>> sposti l' immagine trasmessa dalla directory di partenza (C:\ESITI) alla directory di "inviato" (C\ESITITX), con una istruzione del tipo
Name "C:\ESITI\" & OutFile As "C:\ESITITX\ " & OutFile
-A questo punto ripeti per i nominativi seguenti
Ti confesso che non sono riuscito a aggirare il meccanismo di sicurezza di Outlook, che segnala "Un programma sta tentando di inviare automaticamente la posta elettronica. Consentire l' operazione?"; ricordo che c' e' una sequenza di SendKeys, ma non ho con me nessuna documentazione e dopo un paio di tentativi ho rinunciato; se non l' hai gia' risolto eventualmente ne potremo parlare tra qualche giorno.
Spero che quanto qui scritto ti sia utile.
E buon anno a tutti.