Excel chiama Outlook Express. - dal 04/09/04 pagina vista: volte

Con le ultime versioni di Excel, quelle che sono abilitate agli HyperLinks, risulta abbastanza facile chiamare Outlook Express per comporre un messaggio ed inviarlo: basta scrivere in una cella un indirizzo e-mail; Excel rileva subito che si tratta di un'indirizzo e-mail e imposta di default un collegamento ad OutLook Express. Excel individua subito se in una cella viene inserito il simbolo di AT (la chiocciolina  @  simbolo di un indirizzo e-mail) ed attiva l'hyperlinks.

Basta infatti avvicinarsi alla cella contenente l'indirizzo, il puntatore del mouse assume la forma della "manina", e con un click sull'indirizzo, viene aperta la finestra di Nuovo Messaggio di  OutLook Express con l'indirizzo già inserito (quello su cui abbiamo cliccato nella cella); occorre aggiungere  l'oggetto motivo del messaggio,  inserire il messaggio da inviare, e premere poi il pulsante "Invia" presente sulla finestra del Nuovo messaggio.

Sarà sufficiente scrivere in una colonna gli indirizzi e-mail che ci interessa tenere a portata di mano, per poter inviare da Excel direttamente un messaggio. Il messaggio sarà posto nella cartella "Posta in Uscita" di OutLook Express, e alla prima connessione web verranno inviati i messaggi.

E' possibile impostare istruzioni vba per l'esecuzione attraverso una macro, della composizione di messaggi; è possibile infatti assegnare a variabili i riferimenti alla/alle celle contenenti indirizzi e-mail, ed usare la variabile come vettore dell'indirizzo; è anche possibile definire l'oggetto del messaggio, usando una cella dove scrivere il testo dell'oggetto, assegnare il riferimento di questa cella ad una variabile, e richiamare la variabile nel codice. Questa istruzione d esempio, richiama la finestra Nuovo Messaggio usando come destinatario l'indirizzo e-mail che si troverà nella cella A1:

  • Range("A1").Hyperlinks(1).Follow

Se avremo più di un indirizzo, potremo usare una routine come quella sotto, che controlla tutti gli Hiperlinks presenti sul foglio1, controllando se nel nome esiste la chiocciolina (@), nel caso esista (quindi indirizzo e-mail), verrà aperta una finestra di Nuovo Messaggio, con l'indirizzo letto in quel ciclo; unico aspetto da considerare: dovremo noi inserire il messaggio e premere invio per ogni indirizzo; le finestre successive, una per ogni indirizzo trovato, verranno aperte alla chiusura della precedente, fino alla fine degli indirizzi trovati:

  • Sub multiinvio()
    For Each h In Worksheets(1).Hyperlinks
    If InStr(h.Name, "@") <> 0 Then h.Follow
    Next
    End Sub

Vediamo ora come mantenere il multiinvio, ma inserendo l "oggetto" della missiva, che scriveremo in una cella (la B1 come esempio), inserendo il testo del messaggio che scriveremo anche quello in una cella (la C1). E' evidente che sia l'oggetto che il messaggio saranno gli stessi per tutti i messaggi, anche se i più attenti, potranno risolvere messaggi personalizzati, scritti sulla stessa riga per ogni indirizzo, e che potranno essere inseriti sfruttando Offset. Ma vediamo l'esempio, che scorrerà con un ciclo For Each Next, tutte le celle di un'intervallo, cercando comunque se appare la chiocciolina; se appare, si prende l'indirizzo contenuto nella cella e si assegna all'istruzione "mailto":

  • Sub multiinvio2()
    Dim CL As Range
    For Each CL In Sheets(1).Range("A1:A10")
    If InStr(CL, "@") <> 0 Then
    ThisWorkbook.FollowHyperlink _
    "mailto:" & CL.Value & "?subject=" & Replace([B1].Value, "&", "%26") & _
    "&body=" & [C1].Value & ""
    End If
    Next
    End Sub

Comunque anche in questa routine saremo noi a premere il pulsante "invia" per ogni messaggio. Direi che è comunque un "peso" accettabile il dover premere un pulsante per ogni messaggio, a fronte del trovarsi con oggetto e messaggio già inseriti, ma soprattutto con la possibilità di controlare l'invio dell'email ed eventualmente annullarla.

Va detto che molte funzioni o metodi disponibili per il trattamento della Posta attraverso Excel, non sono sfruttabili disponendo del solo Outlook Express (il programma di gestione e-mail installato col Sistema Operativo), ma solo se disponiamo sul computer di Microsoft Exchange, programma che viene installato sulle recenti versioni del S.O. solamente se si installa la versione completa di Outlook,  installabile con la suite di Office. E' necessario infatti disporre di una libreria di Outlook in Excel, richiamabile dal suo editor di visual basic, menù Strumenti/Riferimenti, mettendo un segno di spunta alla voce: Microsoft Outlook 9.0 Object Library (o altra versione), che sarà disponibile solo se installata la versione completa di Outlook.

Non sono quindi in grado, non dispondendo di Outlook versione completa, di fornire suggerimenti e consigli su come usare istruzioni come SendMail, MailLogon, MailSession, ecc. ecc.o soluzioni che consentano di inviare allegati ("Recipients") ai messaggi (bisogna infatti in questi casi disporre di OutLook completo).

Una procedura interessante, che sfrutta una chiamata alle API di Windows, inviata dal sig. Enrico Manfredini, e-mail cr.manfre@tin.it, e che funziona anche con Outlook Express, è la seguente. La caratteristica che distingue questa procedura dalle altre è che compone il messaggio e lo invia direttamente alla cartella "Posta in Uscita", senza necessità di premere nessun pulsante. Ho modificato leggermente alcune istruzioni  personali di Enrico, impostate per il suo lavoro, sostituendole con istruzioni usabili da chiunque. Voglio solo precisare che la routine è impostata per l'invio di un solo messaggio, all'indirizzo contenuto nella cella A1. Nel caso si voglia procedere ad invii multipli (a più indirizzi) potrete seguire la parte delle istruzioni della macro multiinvio2() relative al ciclo per reperire tutti gli indirizzi di un foglio. Vale altresì la possibilità di usare una cella per scrivere l'oggetto del messaggio richiamando il suo riferimento in Subj (nella macro l'oggetto è scritto direttamente nel codice), come pure il testo del messaggio (anch'esso scritto nel codice) potrà essere un testo scritto in qualisasi cella da richiamarsi nell'istruzione Msg.

Istruzioni da inserire nella Sezione  "Generale - Dichiarazioni" di un Modulo:

Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

------------------------------------------------------------------------------------------------------

e questa la macro:

Sub SendEMail()
Dim Email As String, Subj As String
Dim Msg As String, URL As String

'Prende l'indirizzo email; io ho messo il riferimento alla cella A1
Email = Cells(1, 1)

'Oggetto del messaggio email
Subj = "Informazioni "  
'oppure da una cella:  = " & Range("TuaCella").Value & "

'Compone il messaggio. Oppure Msg  = " & Range("TuaCella").Value & "
Msg = ""
Msg = Msg & "Spett.le Società," & vbCrLf & vbCrLf
Msg = Msg & "Ho il piacere di comunicarVi che il Vostro bonus settimanale è maturato "
Msg = Msg & "Pippo Caruso" & vbCrLf
Msg = Msg & "Presidente"

'Rimpiazza gli spazi con %20 (hex)
Subj = Application.WorksheetFunction.Substitute(Subj, " ", "%20")
Msg = Application.WorksheetFunction.Substitute(Msg, " ", "%20")

'Rimpiazza gli a capo con %0D%0A (hex)
Msg = Application.WorksheetFunction.Substitute(Msg, vbCrLf, "%0D%0A")
'Crea l'URL
URL = "mailto:" & Email & "?subject=" & Subj & "&body=" & Msg

'Lo esegue
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus

'E aspetta 2 secondi prima di inviare il comando
Application.Wait (Now + TimeValue("0:00:02"))
Application.SendKeys "%s"
End Sub

Nota: è l'istruzione Application.SendKeys "%s" che invia l'e-mail, corrispondente alla pressione del pulsante "Invia". Sarà quindi possibile inserirla anche nella routine muntiinvio2(), tenendo presente che non sarà possibile annullare in questa fase l'invio ad un particolare indirizzo. Basta aggiungere questa riga di istruzione prima di Next:

  • .........
    End If
    Application.SendKeys "%s"
    Next
    End Sub

Un sentito grazie a Enrico.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org