Excel sfrutta OutLook.    (seconda parte)- pagina vista: volte
requisiti: conoscenza uso del menu Strumenti/Riferimenti del VBE e della funzione vb CreateObject

 

Premessa

Insieme al Sistema Operativo Microsoft Windows (tutte le versioni) viene installato anche il programma di gestione posta OutLook Express, ma visto che in molti poi installano una Suite Microsoft Office, sarà possibile trovare sul computer anche la versione completa del programma OutLook2000 (o versioni successive).
I due programmi di gestione posta possono convivere sullo stesso computer, basterà decidere quale sarà il programma di posta predefinito nel sistema. Cambia però il modo in cui un altro applicativo, Excel, potrà accedere ad uno o all'altro dei due programmi.
Vedremo quindi quali istruzioni usare per inviare posta da EXCEL, sfruttando i due programmi di posta. Per convenzione, d'ora in avanti useremo l'abbreviazione OE. per OutLook Express, e Ol. per OutLook.
Ancora una cosa: entrambi i programmi di posta, per memorizzare e utilizzare i nomi e indirizzi email, sfruttano la Rubrica (Address Book) comune e/o importabile, la quale mette a disposizione la AddressList a cui è possibile accedere usando il nome del destinatario, oppure l'indirizzo email del destinatario (senza accedere alla Rubrica).

 

Inviare posta da Excel tramite OE.

Tra i diversi metodi per inviare posta da Excel, iniziamo con il più semplice: il metodo FollowHyperlink, in pratica un "collegamento ipertestuale", dell'Oggetto WorkBook. Questo metodo richiede che venga indicato l'indirizzo email del destinatario (mailto:) e sarà possibile inserire l'oggetto del messaggio (subject) ed un messaggio (body) manualmente, o tramite istruzioni vba. (nota: il metodo FollowHyperlink può essere usato sia per collegarsi ad un indirizzo web (Address), sia per spedire posta tramite OE.(mailto:))

L'istruzione base per richiamare la finestra "Nuovo Messaggio" di OE., con il destinatario già inserito, è la seguente:

 

 ThisWorkbook.FollowHyperlink "mailto:maibe@interfree.it"    

Come si nota, l'indirizzo email del destinatario è inserito direttamente nel codice, e scriveremo poi a mano l'oggetto ed il testo del messaggio. Se invece si volessero inserire via codice anche i due argomenti, useremo:

 ThisWorkbook.FollowHyperlink _
"mailto:maibe@interfree.it?subject=" & Replace("Avviso", "&", "%26") & "&body=Salutoni ai lettori.."

Se invece di scrivere gli argomenti di mailto direttamente nel codice, volessimo usare il contenuto di celle del foglio di lavoro, si dovrà predisporre ad esempio, in A1 un'indirizzo email, in B1 il testo dell'oggetto, in C1 il testo del messaggio, e l'istruzione diventa:

 ThisWorkbook.FollowHyperlink _
"mailto:" & [A1] & "?subject=" & Replace([B1], "&", "%26") & "&body=" & [C1] & ""

Con gli esempi sopra, si ottiene la comparsa della finestra "Nuovo Messaggio" di OE. con le istruzioni già compilate, ma si dovrà poi provvedere manualmente a premere il pulsante "Invio" per inviare il messaggio nella cartella "Posta in Uscita" di OE., pronto a partire alla prima connessione internet.

Chiaramente diventa possibile inviare a più destinatari o lo stesso oggetto e testo messaggio, oppure diversificare sia l'oggetto che il testo del messaggio. Sarà sufficiente creare un ciclo che scorra la colonna contenente gli indirizzi email, e ad ogni indirizzo collegare la/le celle contenenti oggetto e testo messaggio.

Nell'esempio seguente, per evitare di premere il pulsante "invia" nella finestra "Nuovo Messaggio" che apparirà ad ogni  indirizzo email letto e predisposto dal ciclo, si inseriscono due righe d'istruzione che hanno il compito di premere per noi il pulsante "Invio", operazione necessaria per evitare di ritrovarci con tanti "Nuovi Messaggi" da inviare quanti saranno gli indirizzi letti.

Si sfrutta per questo il metodo Wait che sospende l'esecuzione di istruzioni per un tempo indicato (necessario all'apertura di una finestra "Nuovo Messaggio") e successivamente l'istruzione SendKeys che invierà alla finestra ora attiva la sequenza di tasti corrispondente ad "invio". Si usa un ciclo Do While..Loop che scorrerà (come esempio) la colonna A a partire dalla riga (r) 1, e fino a che troverà celle con indirizzi email (quindi diverse da vuote), esegue l'istruzioni, in questo caso preferiamo la sintassi Cells, che consente di incrementare il numero riga (r = r + 1). Il tempo di attesa (Wait) è impostato ad 1 secondo (TimeValue), con computer lenti sarà necessario indicare 2 secondi o più.

Dim r As Integer
r = 1
Do While Cells(r, 1) <> ""
ThisWorkbook.FollowHyperlink _
"mailto:" & Cells(r, 1) & "?subject=" & Replace(Cells(r, 2), "&", "%26") & "&body=" & Cells(r, 3) & ""
r = r + 1
Application.Wait (Now + TimeValue("0:00:01"))
Application.SendKeys "%s"     'invia il nuovo messaggio nella cartella OE. "posta in uscita"
Loop

Tacitamente sottinteso che le istruzioni andranno lanciate dal foglio che contiene gli indirizzi email, altrimenti nelle istruzioni andrà indicato anche il nome del foglio sul quale sono gli indirizzi, es. Sheets("tuoFoglio").Cells(tuariga, tuacolonna).

Il metodo FollowHyperlink non consente però di inviare degli "allegati" (Attachments); per questa operazione dovremo usare altre strade che prevedono l'utilizzo di una libreria di sistema, presente sul computer solo se sarà stato installato Microsoft Exchange, e Microsoft Exchange viene installato insieme alla versione completa di Ol.

Dal menù Strumenti/Riferimenti del VBE metteremo un segno di spunta alla libreria "Microsoft Outlook 10.0 Object Library" (o altra versione) corrispondente al file MSOUTL.OLB (normalmente posta in "C:\Programmi\....\Office10\").

Ora si potrà usare OE. (se OE. è il sistema di messaggistica predefinito) per inviare messaggi con allegati. Sfrutteremo il metodo SendMail dell'oggetto Workbook che consente di inviare la cartella attiva ad un nominativo (o a più di uno) presente nella Rubrica, oppure usare il Metodo Route che distribuisce la cartella di lavoro in base alla lista di distribuzione corrente.

 

Metodo SendMail

questa istruzione invia ad un nominativo la cartella di lavoro attiva: dovremo usare il nome-cognome (Recipients) con il quale il nominativo appare nella Rubrica, e non il suo indirizzo email

ActiveWorkbook.SendMail Recipients:="Nome Cognome" 

oppure creare un multi invio usando una matrice (Array) come contenitore dei nominativi:

ActiveWorkbook.SendMail Recipients:=Array("nominativo1", "nominativo2", "nominativo3")

Poichè con Sendmail è possibile inviare solo la cartella attiva, se vorremo inviare un'altra cartella (Workbook) presente sull'Hard-disk, potremo usare un'escamotage: apriamo la cartella da inviare facendola diventare la cartella attiva, la inviamo, e la chiudiamo:

Dim Att
Att = "C:\Documenti\AltraCartella.xls"     'percorso della cartella da inviare come allegato
Workbooks.Open Filename:=Att, ReadOnly:=False       'apriamo la cartella che diventa cartella attiva
ActiveWorkbook.SendMail Recipients:="nome cognome"   'usiamo SendMail sulla cartella ora attiva
Application.Wait (Now + TimeValue("0:00:02"))          ' impostiamo un'attesa di 2 secondi prima di
ActiveWorkbook.Close                                             ' chiudere la cartella

Attenzione: Visto che dovremo usare un nominativo come Recipients e non il suo indirizzo email, è necessario che il nominativo non risulti ambiguo nella Rubrica. Attenzione quindi a nominativi con più indirizzi: diversificate i nominativi nella Rubrica aggiungendo magari un numero progressivo, oppure "ab" per abitazione, "uf" per ufficio, ecc., quindi un "pippo" diventerà ad esempio "pippo ab", "pippo uf" e così via.

 

Precisazione.

a questo punto è necessario fare una considerazione: la proprietà "Recipients" richiede di usare il "nome" come argomento e non l'indirizzo email; ma visto che in un messaggio, si deve usare l'indirizzo email per poterlo spedire, alla conversione nome/indirizzo email provvede lo stesso OE. accedendo alla Rubrica che contiene i dati, per rilevare l'abbinamento nome-indirizzo email.

Nel momento in cui un programma (Excel attraverso OE.) chiede di accedere alla Rubrica per rilevare l'indirizzo email, appare un messaggio che ci chiede il permesso di accesso alla rubrica: dovremo premere il pulsante "Invia" per confermare. Questo messaggio è generato da un sistema di protezione di Outlook (Security Update), e non risulta facile intervenire per impedirne la comparsa. Informazioni al riguardo le potrete reperire presso:
 262701 OL2000: Developer Information About the Outlook E-mail SecurityUpdate
http://support.microsoft.com/?id=262701
262631 OL2000: Information About the Outlook E-mail Security Update
http://support.microsoft.com/?id=262631
 

(Lo stesso discorso vale anche se utilizzeremo Ol., con addirittura due o tre finestre messaggio)

 

Metodo Route

Il metodo Route dell'oggetto Workbook distribuisce la cartella di lavoro attiva in base alla lista di distribuzione corrente; se la cartella non dispone di una lista di distribuzione è possibile creare una lista al momento dell'invio, utilizzando un Array dei nominativi dei destinatari. Si dovrà solo impostare la proprietà HasRoutingSlip dell'oggetto Workbook a True, condizione necessaria per poter usare la proprietà RoutingSlip dell'oggetto Workbook, che restituisce l'oggetto RoutingSlip (lista di distribuzione) del quale si potranno sfruttare alcune sue proprietà:

Delivery - Restituisce o imposta il metodo di consegna utilizzato per la distribuzione. Può essere rappresentato da una delle costanti XlRoutingSlipDelivery seguenti: xlOneAfterAnother o xlAllAtOnce.

Recipients - Restituisce o imposta i destinatari alla lista di distribuzione.

Subject - Restituisce o imposta l'oggetto per un mailer o una lista di distribuzione.

Message - Restituisce o imposta il testo del messaggio per la lista di distribuzione.

Questo esempio invia la cartella attiva come lista di distribuzione; tutti i destinatari figureranno nel campo " A: " del messaggio :

With ActiveWorkbook
  .HasRoutingSlip = True
    With .RoutingSlip
      .Delivery = xlAllAtOnce
      .Recipients = Array("destinatario1", "destinatario2", "destinatario3", ecc.)
      .Subject = "Questo è il file.xls"
      .Message = "Questo è il file di prova invio. Cosa ne pensi?" & vbCrLf
    End With
ActiveWorkbook.Route
End With

Conclusioni:

Sfruttando OutLook Express non possiamo inviare allegati diversi dalla cartella excel in quel momento attiva; se vorremo inviare altri tipi di file (immagini, documenti, ecc.) dovremo usare OutLook versione completa.


 

Seconda parte:

Inviare posta da Excel tramite Ol.

Come anticipato, con OutLook è possibile inviare allegati, diversi dalla cartella attiva, alle nostre email. Ricordiamoci comunque:

  1. Caricare in Excel la libreria preposta al dialogo tra Excel ed OutLook : dal menù Strumenti/Riferimenti del VBE metteremo un segno di spunta alla libreria "Microsoft Outlook 10.0 Object Library" (o altra versione) corrispondente al file MSOUTL.OLB (normalmente posta in "C:\Programmi\....\Office10\").

  2. Sopportare le tre dialogsBox, per ogni email inviata,  che il sistema ci propina per l'accesso alla Rubrica, imposta dal Security Update di OutLook. Non mi interpellate per sapere come eliminarle, perchè non lo so. Chi crede, può visitare i siti sopra consigliati e sbrogliarsela da solo.

  3. I messaggi comunque inviati saranno posti all'interno della cartella Posta in Partenza del programma OutLook (non di OutLook Express) in attesa del collegamento ad internet.

  4. Visto che dovremo usare un nominativo come Recipients e non il suo indirizzo email, è necessario che il nominativo non risulti ambiguo nella Rubrica. Attenzione quindi a nominativi con più indirizzi: diversificate i nominativi aggiungendo magari un numero progressivo, oppure "ab" per abitazione, "uf" per ufficio, ecc., quindi un "pippo" diventerà ad esempio "pippo ab", "pippo uf" e così via.

Per poter accedere ad Outlook da Excel, abbiamo bisogno di aprire un sessione con Outlook ed usiamo il CreateObjects. Sfrutteremo il metodo Send applicato all'oggetto MailItem che grazie al metodo CreateItem ci consente di creare appunto un nuovo messaggio di posta elettronica. Vediamo una routine d'esempio; invieremo ad un nominativo (Recipients) un email, indicato l'oggetto del messaggio (Subject), un breve testo di messaggio (Body), ed un file (Attachments) contenuto in una cartella del nostro Hard-disk indicando il percorso completo che mira al file. E' possibile anche in questo caso, creare un multi invio, usando una delle soluzioni già esemplificate sopra; se vorremo ad esempio inviare lo stesso file a più di un destinatario, useremo un Array per definire i nominativi, oppure potremo definire una lista (posta sul foglio di lavoro) da scorrere con un ciclo, lista che comprenderà i campi "nominativo", "oggetto del messaggio", "testo del messaggio", "percorso del file da allegare", e chiaramente potremo in ogni cella, diversificare uno o più argomenti per ogni nominativo.

 Sub InviaAllegati()
  Set MioOutlook = CreateObject("Outlook.Application")
  Set Miaposta = MioOutlook.CreateItem(olMailItem)
  Miaposta.Subject = "Inserire testo Oggetto"
  Miaposta.Body = "Inserire testo da inviare"
  Miaposta.Recipients.Add ("Pinco Pallino")
  Miaposta.Attachments.Add ("C:\Temp\Lettera.doc")
  Miaposta.Send
End Sub

Questa sotto invece è un'altra serie di istruzioni che ho reperito in internet (non mi ricordo dove), idonea per il multi invio con allegato. Non è difficile da capire: si suppone di avere un elenco di nominativi nella colonna A del foglio, a partire dalla riga 1, e nella colonna B il testo del messaggio, si applica l'ordinamento dei nominativi, indi inizia un ciclo che scorre i nominativi presenti, e per ogni nominativo letto nel ciclo, si chiama la sub SendMessage per l'invio del messaggio e dell'allegato, con il controllo (Is Missing) che l'allegato esista.

Dichiarazioni da inserire nella zona "Generale - Dichiarazioni" del modulo:

'--- Set up the Outlook objects.
Dim objOutlook As Outlook.Application
Dim objOutlookMsg As Outlook.MailItem
Dim objOutlookRecip As Outlook.Recipient
Dim objOutlookAttach As Outlook.Attachment

'--- Declare our global variables to be used in each subroutine.
Dim CustomerAddress As String
Dim CustomerMessage As String

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

Questa la Sub da associare ad un pulsante:

Sub MailItNow()

'--- Declare our variables.
Dim X As Integer
Dim TempCustomerAddress As String

'--- Prevent screen redraws until the macro is finished.
Application.ScreenUpdating = False

'--- Sort the addresses and names alphabetically, by the e-mail address.
'--- This is REQUIRED to prevent any duplicate addresses from
' receiving more than one e-mail.

Columns("A:B").Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

'--- Sets which row to start searching for e-mail addresses and names.
X = 1

'--- Begin looping through all the e-mail addresses in column A until
' a blank cell is hit.
While Range("A" & X).Text <> ""

'--- These variables will be used to search for duplicates.
CustomerAddress = Range("A" & X).Text
TempCustomerAddress = CustomerAddress

'--- Increment X until a different e-mail address is found.
While TempCustomerAddress = CustomerAddress
X = X + 1
CustomerAddress = Range("A" & X).Text
Wend

'--- Add the e-mail address to a global variable.
CustomerAddress = Range("A" & X - 1).Text
'--- Add a message with the user's name to the e-mail.
'--- Customize your own message and closing here.
CustomerMessage = Range("B" & X - 1).Text & "," & vbCrLf & vbCrLf _
& "Thank you for trying our product!" & vbCrLf & vbCrLf & _
"Sincerely," & vbCrLf & "ProductCo Inc."

'--- Run the subroutine to send the message.
Call SendMessage

Wend

End Sub
                                  -----------------------------------------------------------------------------------------------------

E questa la sub SendMessage :


Sub SendMessage(Optional AttachmentPath)

'--- This is required to prevent a name which does not resolve to
' an e-mail address from hanging the app.
On Error Resume Next

' Create the Outlook session.
Set objOutlook = CreateObject("Outlook.Application")

' Create the message.
Set objOutlookMsg = objOutlook.CreateItem(olMailItem)

With objOutlookMsg
' Add the To recipient(s) to the message.
Set objOutlookRecip = .Recipients.Add(CustomerAddress)
objOutlookRecip.Type = olTo

' Set the Subject, Body, and Importance of the message.
.Subject = "Thank You!"
.Body = CustomerMessage
.Importance = olImportanceHigh 'High importance

' Add attachments to the message.
If Not IsMissing("C:\Temp\Cartel1.xls") Then
Set objOutlookAttach = .Attachments.Add("C:\Temp\Cartel1.xls")
End If

' Resolve each Recipient's name.
For Each objOutlookRecip In .Recipients
objOutlookRecip.Resolve
If Not objOutlookRecip.Resolve Then
Exit Sub
End If
Next
.Send '--- Send the message.

End With

'--- Remove the message and Outlook application from memory.
Set objOutlookMsg = Nothing
Set objOutlook = Nothing
End Sub
 

Credo di aver presentato una panoramica più dettagliata dell'altro articolo "Excel chiama Outlook", anche se incompleta, e anche se esistono altre routines compilabili. Ma gli argomenti trattati in questo articolo non fanno parte delle mie conoscenze "migliori" (non sono argomenti che mi interessano in modo particolare, e che non uso, preferendo la gestione manuale della mia posta, compreso l'invio di allegati).

Se qualcuno sarà interessato, lo invito a "gustarsi" la guida in linea, che è ricca di spiegazioni.

Buon lavoro.



 

prelevato sul sito www.ennius.altervista.org