Far lampeggiare (blinking) i Fonts (i caratteri).      (09/06/03)

Un modo di evidenziare determinate situazioni che si verificano sul foglio di lavoro, potrebbe essere affrontato con l'esercizio che sto presentando : intervenire sui fonts alternando colori diversi dei fonts in modo da creare l'effetto "lampeggio", che richiamerebbe inevitabilmente l'attenzione di chi sta lavorando. 

Classici esempi di utilizzo potrebbero essere controlli su elenchi di numeri (se il valore che si avrà in una cella o range di celle, non sia maggiore o minore di determinati valori, oppure se in una somma totale si raggiunge o si supera un certo valore, oppure ancora se compare un determinato numero, ecc.), controlli su testo o ancora su date, insomma, le condizioni da poter valutare sono talmente tante che ognuno adatterà i concetti alle proprie esigenze.

Intanto vediamo le condizioni necessarie per usare le routine:

  1. L' area su cui intervenire - potremo assegnarla su una singola cella, oppure su più celle anche non contigue, oppure su un Range di celle, o ancora su tutto il foglio di lavoro.

  2. L'evento per attivare - potremo affidarci ad un pulsante che lanci la macro, oppure scegliere un automatismo come l'evento WorkSheet_Change per richiamare la macro ad ogni cambiamento nella celle/celle o area predefinita.

  3. Interruzione della macro - in questo caso realizzeremo una routine che ci consenta manualmente, tramite un pulsante, di interrompere l'effetto "lampeggio" .

Le istruzioni per ottenere il "lampeggiare" si basano sul metodo OnTime di cui riporto la descrizione reperibile sulla guida in linea del VBE:

Metodo OnTime
Programma una routine affinché venga eseguita a una determinata ora futura, vale a dire a una determinata ora del giorno o dopo un determinato periodo.
Sintassi :
espressione.OnTime(EarliestTime, Procedure, LatestTime, Schedule)

Osservazioni
Utilizzare Now + TimeValue(time) per una programmazione in un'ora successiva all'ora corrente.
un esempio che esegue la macro my_Procedure 15 secondi dopo l'ora corrente:
Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"

il concetto è semplice: OnTime basa la partenza sull'ora attuale (Now che corrisponde ad ADESSO()) alla quale aggiunge un tempo che decideremo noi, in questo esempio 15 secondi, dopodichè lancia la macro (il cui nome è racchiuso tra doppi apici e preceduta da una virgola). Impostando il tempo ad 1 secondo, otterremo l'effetto "lampeggio". Ma modificheremo opportunamente queste istruzioni per farle rispondere alle nostre esigenze, non vogliamo infatti lanciare nessuna macro tramite OnTime, bensì inizializzarla. Vediamo le istruzioni, in verde i soliti commenti:

Usando un Modulo per ospitare le macro, inseriamo nella sezione "Generale  -  Dichiarazioni" del modulo la variabile NextTime come Date, comune ad entrambe le macro.

Dim NextTime As Date

__________________________________________________________________

Sub Lamp()

'sotto : impostiamo l'area sulla quale intervenire settando la variabile "zona"
Set zona = Range("E1:G20")
'un'area presa ad esempio

'impostiamo la variabile NextTime che sarà uguale a Now più un secondo
NextTime = Now + TimeValue("00:00:01")

'sotto: Con i caratteri nelle celle nell'area scelta (zona)
With zona.Cells.Font

'se il colore dei fonts è nero, lo colori rosso, altrimenti lo colori nero, è questo che crea 'l'effetto "lampeggio" ogni secondo
If .ColorIndex = 1 Then .ColorIndex = 3 Else .ColorIndex = 1
End With 
 'fine Con....

'sotto: trascorso il primo secondo, si rilancia la stessa macro "Lamp" sfruttando ancora il 'metodo OnTime
Application.OnTime NextTime, "Lamp"
End Sub

ora vediamo la routine per interrompere l'istruzione appena vista. Anche in questo caso si ricorre al metodo OnTime, ma sfruttando l'argomento Schedule che, impostato a False, consente di "cancellare" una (la) routine impostata precedentemente (Lamp). Oltre all'interruzione della routine, abbiamo bisogno di inserire un'istruzione che ripristini il colore dei fonts a nero, nel caso che si sia interrotta la routine mentre i fonts erano colorati in rosso. Queste le istruzioni:

Sub Stoppa()
Set zona = Range("E1:G20")

'sotto: si richiama col metodo OnTime la macro "Lamp", ma con "schedule" uguale a 'False, la interrompiamo, cancellandola
Application.OnTime NextTime, "Lamp", schedule:=False

'si ripristina il colore nero nei fonts
zona.Cells.Font.ColorIndex = xlAutomatic
End Sub

Quindi, viste le due routine, che potranno essere entrambe attivate da pulsante (la macro "Stoppa" dovrà essere comunque sempre attivata manualmente), prendiamo in esame come automatizzare l'avvio della macro "Lamp". Come già detto, diverse sono le necessità di essere avvisati, con il lampeggio, per cui prendiamo in esame un evento solo il Worksheet_Change, ma con due diverse istruzioni:

  1. Lampeggiare dei fonts su tutta l'area al verificarsi anche in una sola cella di una determinata condizione.

  2. Lampeggiare dei fonts solo su due celle nell'area al verificarsi di una determinata condizione, uguale e anche diversa per ognuna delle due celle.

Prima ipotesi: se in una qualsiasi cella della zona scelta, sarà immesso un valore superiore a 3500

Private Sub Worksheet_Change(ByVal Target As Range)

'è necessario creare un ciclo For Next per controllare i valori di tutte le celle dell'area
Dim C As Object
Set zona = Range("E1:G20")
'impostiamo la zona
For Each C In zona 
'per ogni cella in zona
If C.Value > 3500 Then
 'se il valore in una cella è maggiore di 3500
Lamp
 'si chiama la macro Lamp
End If
Next
End Sub

E' pacifico che se i criteri per l'attivazione fossero più di uno, dovremo modificare le istruzioni If con l'aggiunta degli operatori And oppure Or, o con l'inserimento di altre condizioni tramite ElseIf.

Seconda ipotesi: se in due celle ben definite si verificherà una certa condizione: attiveremo la macro Lamp se nella cella F2 oppure nella cella F7 ci sarà un valore superiore a 3500

Private Sub Worksheet_Change(ByVal Target As Range)
Set X = Range("F2")
Set Y = Range("F7")
If X > 3500 Or Y > 3500 Then
Lamp
End If

End Sub

Se invece si volesse che in entrambe le celle si verifichi che un valore superi  3500 per attivare il lampeggio, basterà modificare la riga:

If X > 3500 Or Y > 3500 Then

con

If X > 3500 And Y > 3500 Then

Per interrompere il lampeggio cliccheremo sul pulsante associato alla macro "Stoppa".

 

Buon lavoro.

prelevato sul sito http://ennius.interfree.it