Ottenere un messaggio di avviso impostato su un controllo di una data. - dal 04/09/04 pagina vista: volte

Una domanda rivoltami è il motivo di questo articolo: disponendo di un database di Nomi e relativa data di nascita (oltre ad altri dati correlati), si vuole essere avvisati quando è il compleanno di un nominativo inserito nel database. L'esercizio si presta comunque a innumerevoli utilizzi, legati comunque a controlli su date, ma veniamo all'esercizio. Supponiamo di avere un database come questo, con i campi "Nominativo", "Nato a:", "Nato il:", ed altri campi che vorrete:

I concetti sono semplici: controllare con la data del giorno (in cui si apre la cartella), tutte le date di nascita contenute nella colonna D, e trovata corrispondenza del giorno e del mese, avvisare con un messaggio. Inseriamo le istruzioni in un modulo standard creando una macro, che poi potremo richiamare in diversi modi:

  • Inserendo un pulsante sul foglio di lavoro, ed associando il pulsante al nome della macro. Saremo noi a lanciare la macro.

  • All'apertura della cartella, in modo da essere avvisati subito dei compleanni che ricorrono. Per questo useremo l'evento Workbook_Open, posizionando nell'evento il richiamo alla macro, così:

  • Private Sub Workbook_Open()
    BuonCompleanno 
     'nome della macro
    End Sub

  • Oppure all'apertura di un determinato Foglio di lavoro, sfruttando l'evento Worksheet_Activate, per esempio del Foglio2, così (ricordo che ogni foglio ha i propri eventi, relativi a quel foglio):

  • Private Sub Worksheet_Activate()
    BuonCompleanno  
    'nome della macro
    End Sub

Vediamo la routine da inserire in un modulo, e in verde i commenti:

Sub BuonCompleanno()
Dim Zona
Dim CL As Object

'sotto: impostiamo con "Zona" l'area su cui eseguire il ciclo di ricerca: la colonna D del 'foglio1, a partire dalla cella D3 e, verso il basso, fino che esistono celle occupate
Set Zona = Worksheets("Foglio1").Range([D3], [D3].End(xlDown))

'sotto: iniziamo il ciclo che controllerà una per una, tutte le celle nell'area "Zona"
For Each CL In Zona

'sotto: con la variabile "anni" reperiamo la differenza in anni tra la data contenuta nella 'cella e la data del giorno corrente, usando la funzione DateDiff (vedi l'altro sito, sez. 'vba), questo ci servirà per indicare el messaggio di avviso quanti anni ha il nominativo 'così trovato
anni = DateDiff("yyyy", CL.Value, Now)
'sotto: con la variabile "giornomese" reperiamo con la funzione Mid (vedi l'altro sito, sez. 'vba) solo il giorno e il mese della data del giorno, necessaria per eseguire il controllo.
giornomese = Mid(Now, 1, 5)

'sotto: con If impostiamo il controllo condizionale: se il giorno e il mese presenti nella cella '(CL) sono uguali alla variabile "giornomese" allora:
If Mid(CL.Value, 1, 5) = giornomese Then

'sotto: con la variabile "nome" reperiamo il nominativo che si trova due colonne a sinistra, 'stessa riga (Offset(0, 2) rispetto alla cella in quel momento controllata
nome = CL.Offset(0, -2).Value

'sotto: e si avvisa con il messaggio che lega il nome e gli anni
MsgBox "Oggi è il compleanno di " & nome & " e compie " & anni & " anni."
End If
Next

End Sub

e questi saranno i risultati che vengono ovviamente visualizzati in sequenza, uno dopo l'altro:

Ognuno potrà decidere di visualizzare il messaggio a lui più congeniale variando il contenuto del messaggio stesso.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org