Il blog di Gianni Giaccaglini

Blog su VBA e VSTO
Gianni Giaccaglini

My Links

News

NB - V. anche gli ARTICOLI (in fondo a questa barra)
Solo quesiti validi a: giannigiac@tin.it
Il mio nuovo libro


La mia nipotina ELISA

Foto con dedica a ME di
Bill Gates giovanissimo
nei mitici anni 80!

Categorie Post

Categorie Articoli

Archivio

Immagini

Blog Stats

Elenco degli appuntamenti Outlook in un foglio Excel

Elenco appuntamenti Outlook in un foglio Excel

La gestione degli appuntamenti in Outlook è molto utile, visto che ogni giorno che passa crescono gl’impegni anche tra i comuni mortali. Non starò qui a ricordare la comodità del Calendario con i suoi pratici “svegliarini” al momento giusto, a seconda di come abbiamo impostato la specifica opzione (tot minuti o tot giorni prima dell’evento).

La semplice macro che propongo ha lo scopo di fornire, in un foglio Excel, la lista degli appuntamenti, ottenendone una panoramica e con possibilità di stamparla, potendola appendere nello studio o consultarla in giro senza portarsi dietro il PC.

Il modellino si può scaricare dal link seguente:

http://bloggianni.altervista.org/ElencoAppuntOulook.xls

(ma è facile crearselo da soli, seguendone la descrizione che segue).

Qualcuno obietterà che esiste un comando di Outlook per ottenere lo stesso scopo. Vero e lo ricordo a ignari & immemori: lanciare File > Importa ed esporta… poi nei vari passaggi dell’accorrente wizard, scegliere Esporta in un file > Microsoft Excel > Calendario e così via. Il procedimento permette anche di scegliere tra gl’innumerevoli campi quei quattro o cinque che ci interessano.

Ai tempi non trascurabili del pur facile metodo si unisce poi un inconveniente: il database non sempre è ordinato per data come tutti si attendono (forse dipende dai tempi di creazione? Va a sapere…).

Ed è qui che può intervenire Excel, per tacere del fatto che il modellino in parola serve altresì a richiamare gl’impegni mentre stiamo lavorando con Excel, anche se Outlook non è aperto.

Come è fatto il modello e come funziona

Il layout del Foglio1 si presenta così:

 

A

B

C

D

E

F

1

Data

Ora

Tema

Durata

Scaduto?

 

2

venerdì 5 gen 07

8.00

Impegno del cavolo

3,00

Si

 

3

giovedì 25 gen 07

9.30

Rinnovo Bollo auto

0,50

 

 

4

martedì 30 gen 07

9.30

Rata Camper

0,50

 

 

5

giovedì 1 feb 07

9.00

Seminario Adobe Acrobat

6,00

 

 

6

 

 

 

 

 

 

Non occorre dire altro, se non andare a sbirciare il macrocodice. Cominciamo con una routine esplorativa, propedeutica alla comprensione degli oggetti Outlook VBA richiamati nel nostro caso. Prima però ricordo un’operazione essenziale: fissare nell’Editor Visual Basic di Excel i riferimenti alla libreria Outlook, mediante Alt+F11 poi Strumenti > Riferimenti… mettendo il segno di spunta su Microsoft Outlook nn Object Library.

Sub EsploraAppuntamenti()

  Dim Nms As Namespace

  Set Nms = Outlook.GetNamespace("MAPI")

  Dim Calend As MAPIFolder

  Set Calend = Nms.GetDefaultFolder(olFolderCalendar)

  Dim Appunt As AppointmentItem

  For Each Appunt In Calend.Items

    Debug.Print Format(Appunt.Start, "dddd, d mmm yy")

    Debug.Print Format(Appunt.Start, "hh/mm")

    Debug.Print Appunt.Duration

    Debug.Print Appunt.Subject

  Next

End Sub

Lanciando – magari passo passo: stiamo imparando! – la precedente Sub si vedranno la data, l’ora di inizio e la durata di ciascun appuntamento presente del database di Outlook. Come già indicato in altri post dedicati ad Outlook VBA, in casi del genere va sempre fissato (Set) il Namespace di Outlook “MAPI” (obbligatorio, relativo alla particolare  struttura di cartelle dei dati “postali”, non chiedetemi altro, non lo so!). Quindi si imposta nella variabile Calend  la cartella MAPI (MAPIFolder) relativa al nostro calendario. Questo col metodo GetDefaultFolder del Namespace “MAPI”.

Definita poi Appunt come variabile di tipo AppointItem, si innesta un ciclo For Each Appunt... Next, che spazzola tutti gli appuntamenti del calendario per segnalarne le proprietà Start e Duration, come già detto. A tale riguardo è il caso di precisare che Start è un numero seriale data + orario, per cui due opportune funzioni Format ne evidenziano le parti.

Prima di proseguire mi permetto di sottolineare, oltre che l’eleganza, anche l’utilità del ciclo For Each. Si poteva usare pure un loop equivalente, mediante indice:

For i = 1 To Calend.Items.Count

  Debug.Print Format(Calend.Items(i).Start, "dddd, d mmm yy")

  Eccetera

Next

 

Ma in tal caso il generico Items(i), che si applica ai diversi Folder di Outlook come (Indirizzi, InBox, OutBox…) NON esporrebbe accanto al punto (.) le proprietà tipiche di un oggetto AppointItem e, insomma, l’intellisense non ci verrebbe in aiuto. A memoria futura!

Il codice operativo

Ecco anzitutto la routine base, con argomento CellaIniz, la cella a partire dalla quale parte il sospirato elenco:

Sub ElencaAppunt(CellaIniz As Range)

  Dim Nms As Namespace

  Set Nms = Outlook.GetNamespace("MAPI")

  Dim Calend As MAPIFolder

  Set Calend = Nms.GetDefaultFolder(olFolderCalendar)

  Dim Appunt As AppointmentItem

  Dim iCella As Integer

  'Sembrava che il seguente metodo Sort si applicasse

  'agli items di tipo AppointmentItem. E invece.... NON VA!

  Calend.Items.Sort Property:="[Start]", Descending:=False 'Ordinam.to crescente

  'Pertanto il sort per data verrà affidato a Excel, nella Sub ElencaApp

  For Each Appunt In Calend.Items

    iCella = iCella + 1

    'L'istruz. seguente NON va! genera stringhe e il SORT per data poi fallisce

    'CellaIniz(iCella, 1) = Format(Appunt.Start, "dddd, d mmm yy")

    With CellaIniz(iCella, 1)

      .NumberFormat = "dddd d mmm yy"

      .Value = Appunt.Start

    End With

    With CellaIniz(iCella, 2)

      .NumberFormat = "h:mm;@"

      .Value = Appunt.Start

    End With

    CellaIniz(iCella, 3) = Appunt.Subject

    With CellaIniz(iCella, 4)

      .NumberFormat = "0.00"

      .Value = Round(Appunt.Duration / 60, 2)

    End With

    CellaIniz(iCella, 5) = IIf(Appunt.Start < Now, "Si", "")

  Next

End Sub

Dopo la routine propedeutica del paragrafo che precede resta poco da dire, salvo invitare a meditare sulle due note in verde, che rappresentano altrettante sorprese. Parlo solo della prima: il metodo Sort relativo agli Items di un Folder Outlook, preso alla lettera promette l’ordinamento in base alla chiave Property ed in senso decrescente o meno a seconda del valore True o False dell’argomento Descending. La deludente istruzione Calend.Items.Sort ... accetta senza proteste la chiave Start (con o senza [ e ]), peccato perrò che... non succede nulla!

Nota – Probabilmente la cosa marcia con altri tipi di Folder, come quello degl’indirizzi. Chi è interessato non ha che da verificare.

Ecco infine la routine operativa, che richiama la precedente a partire dalla cella A1 del foglio. Si conclude con l’ordinamento della tabella Excel, sfruttando il metodo Sort dello spreadsheet.

Sub ListaAppuntamenti()

  Dim i As Integer

  Foglio1.UsedRange.ClearContents

  Range("A1") = "Data"

  Range("B1") = "Ora"

  Range("C1") = "Tema"

  Range("D1") = "Durata"

  Range("E1") = "Scaduto?"

  ElencaAppunt Range("A2")

  Range("A1").Sort Range("A1"), header:=xlGuess

End Sub

L’istruzione finale fa affidamento sul “riconoscimento automatico” dell’intervallo di celle contigue alla cella A1, prendendo A1 anche come chiave di ordinamento.

Nota – Importante l’argomento header:=xlGuess che esclude dal sort le intestazioni. Si provi a toglierlo: si vedrà che (brutta) fine fanno!

?>

posted on martedì 16 gennaio 2007 18.27