Sfolgorio di celle, in varie salse
Questa soluzione curiosa deriva dalla richiesta di un tal Vito Borrelli: come ottenere il lampeggio di celle di un foglio Excel, magari caratterizzate da certi valori? Pensa e ripensa, ho creato un modellino didattico ad hoc, scoprendo inoltre che la formattazione condizionale:
· Ovviamente non supporta lampi o saette, come d’altronde neanche Excel;
· Non convive, di fatto, con il lampeggiamento ottenuto tramite macro VBA.
Per non far patire la gente con le attese, indico subito da dove si scarica il file Lampeggio.zip, scompattando il quale si ottiene, naturalmente, il modello Lampeggio.xls:
http://www.dotnetromacesta.org/common/allegati/lampeggio.zip
Premesso che i controlli adottati sono quelli classici di Excel, non degli Activex, l’ aspetto del foglio principale è, grossomodo, il seguente:
|
|
A |
B |
C |
D |
E |
F |
G |
H |
|
1 |
Cella input => |
|
|
|
|
|
|
|
|
2 |
|
|
|
Lampeggio cella attiva |
|
|
|
3 |
Scegli velocità: |
(solo per lampeggio CICLICO) |
|
|
|
|
|
4 |
[ Combo box ] |
0,01 |
|
|
-1 |
-4 |
2 |
|
|
5 |
3 |
|
|
|
5 |
3 |
-4 |
|
|
6 |
Lenta |
0,2 |
|
|
-9 |
7 |
-5 |
|
|
7 |
Media |
0,07 |
|
|
0 |
-1 |
6 |
|
|
8 |
Veloce |
0,01 |
|
|
4 |
4 |
-5 |
|
|
9 |
|
|
|
|
-8 |
-7 |
5 |
|
|
10 |
|
|
|
|
4 |
0 |
3 |
|
|
11 |
|
|
|
|
-3 |
0 |
-8 |
|
|
12 |
|
|
|
|
|
|
|
|
|
13 |
|
|
|
|
|
|
|
|
In alto “Lampeggio cella attiva” è la caption, eloquente direi, di un pulsante, mentre “[Combo box]” vuole, alla buona, raffigurare una casella a discesa, con la quale l’utente può optare per una fra tre velocità, o meglio tempi. Un altro nome, “Zona” l’ho affibbiato all’intervallo di celle celestine E4:G11, contenente funzioni =CASUALE.TRA(-10;8) di modo che premendo il tasto F9 (RICALCOLA) sono generati numeri casuali, con prevalenza di quelli positivi.
L’uso del modello è facile e immediato. Al lancio si scatena un lampeggio in technicolor nelle celle > 0 di Zona precedute da una MsgBox che ne indica i riferimenti. Anche il clic sul pulsante Lampeggio cella attiva o su altri non indicati in figura permette ai soliti Chicche & Sia di vedere non di nascosto l’effetto che fa.
Le prime macro
Vediamo subito una routine basilare:
Sub Lampeggia(Cella As Range, Tempo As Double, _
NumLamp As Integer)
Dim PrecCol As Integer
Dim i As Integer
Application.ScreenUpdating = True
For i = 1 To NumLamp
PrecCol = Cella.Interior.ColorIndex
With Cella
.Interior.ColorIndex = 3 ' Un valore un po' a caso
Attesa Tempo
.Interior.ColorIndex = PrecCol
Attesa Tempo
End With
Next
End Sub
Sub Attesa(T As Double)
Dim QuestiSec As Double
QuestiSec = Timer
While Timer < QuestiSec + T
Wend
End Sub
Il nocciolo della routine Lampeggia sta nel ciclo For i = 1 To NumLamp che determina il numero di lampeggi e ad ogni giro fissa un colore di indice 3 (rosso) nella Cella restituendone poi il colore originario PrecCol stoccato opportunamente prima del loop. Tra i due eventi si interpongono due pause ottenute dalla Sub Attesa passando a quest’ultima il valore Tempo.
Chi ha capito l’antifona non avrà problemi di comprendonio con la routine che segue, connessa al pulsante già visto nella precedente figurina:
Sub LampCellaAttiva()
Lampeggia ActiveCell, 0.1, 20
End Sub
Lampeggio applicato a un intervallo
Stavolta mostro una routine con argomento (unico) Zona, seguita dalla procedura LampCellePositive richiamabile con un altro pulsante non mostrato nella solita figura.
Sub LampeggiaZona(Zona As Range)
' Per semplicità, tutte le celle di Zona stesso colore
Dim PrecCol As Integer
Dim i As Integer
Application.ScreenUpdating = True
PrecCol = _
Zona(1).Interior.ColorIndex 'Ipotesi: tutte le celle stesso colore
For i = 1 To 20
With Zona
.Interior.ColorIndex = 14 ' Un valore un po' a caso
Attesa 0.1
.Interior.ColorIndex = PrecCol
Attesa 0.1
End With
Zona.Interior.ColorIndex = PrecCol
Next
End Sub
Sub LampCellePositive()
Dim CellePos As Range, c As Range, sw As Boolean
For Each c In Range("Zona")
'MsgBox c ' Servita per debug
If c > 0 Then
If Not sw Then
Set CellePos = c
sw = True
Else
Set CellePos = Union(CellePos, c)
End If
End If
Next
MsgBox "Celle che contengono valore > 0:" _
& vbLf & CellePos.Address
LampeggiaZona CellePos
' CellePos.Select ' non serve ed evita l'evento SelectionChange
End Sub
Si coglie bene l’analogia del procedimento della LampeggiaZona con quello della precedente Lampeggia ora esteso a tutte le celle di una Zona. La particolarità sta nella Sub chiamante, applicata al già citato intervallo di nome “Zona” (dio, che noia!) e che sfrutta la speciale funzione Union. Questa nel nostro caso concatena nella variabile CellePos le coordinate di tutte e sole le celle c con valore > 0.
Il risultato viene segnalato da una MsgBox che proclama qualcosa del genere:
$G$4,$E$5,$G$6,$E$8,$G$9,$F$10,$E$11:$F$11
Nota. Tale istruzione, di valenza didattica, può eliminarsi in un caso reale.
Con LampeggiaZona CellePos si hanno lampi azzurri nell’intera selezione discontinua CellePos.
Prima di proseguire riproduciamo due routine di evento ospitate nel modulo Foglio1:
Private Sub Worksheet_Activate()
LampCellePositive
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
' MsgBox Target.Address ' Usato per debug
If Target.Address <> "$B$1" Then Exit Sub
If Target.Value > 0 Then
Lampeggia Target, 0.1, 20
End If
End Sub
La prima si scatena se si attiva un foglio diverso poi si torna al Foglio1. L’altra si fa viva quando si modifica il valore della cella B1. Quello che ciascuna fa è facile da capire e ancor più lo è usando il modellino.
Lampeggio ciclico di un intervallo
È stata l’ultima pensata: anziché interessare in simultanea tutte le celle, può essere grazioso farle brillare una dopo l’altra. Il frutto di tale sforzo creativo è subito visto:
Sub LampCiclicoCellePositive()
Dim c As Range, i As Integer
Dim T As Double
T = Range("Tempo")
For i = 1 To Choose(Range("TipoVel"), 2, 3, 10)
For Each c In Range("Zona")
If c > 0 Then
Lampeggia c, T, 1
'c.Select ' non serve ed evita l'evento...
End If
Next
Next
End Sub
Tale Sub è connessa a un terzo pulsante etichettato in modo inequivocabile.
Commenti essenziali. Non sorprende che stavolta si utilizzi la Sub Lampeggia relativa a cella singola né, si spera, il gioco dei due cicli, il più interno che spazzola e fa brillare una ad una le celle positive della solita Zona, quello esterno che fa ripetere il lampeggio ciclico un numero di volte opportuno dipendente dal valore che l’utente attinge dalla Combobox citata in apertura. Si riesamini la solita figura iniziale e si sappia che la scelta dell’utente è fra i tre tempi in B6:B8 (relativi all’azione lenta, media e veloce), si riversa in due celle:
- A5, denominata “TipoVel”, che nelle combo “classiche” è l’indice della scelta (qui tra 1 e 3);
- B4, denominata “Tempo”, ove la formula =INDICE(B6:B8;A5) determina appunto il valore del tempo scelto.
A questo punto dovrebbe essere chiaro il ruolo della funzione Choose(Range(“TipoVel), 2, 3, 10) della nostra macro. Come esso si svolga, in modo da adeguare i cicli alle scelte (minori con “Lenta” massimi con “Veloce”) viene lasciato all’esegesi autogestita dei non digiuni di VBA. E lo stesso dicasi per lo scatenarsi dei lampi ciclici ogni volta che si seleziona Zona. Esaminare, per comprenderne il gioco, la routine d’evento SelectionChange nel modulo Foglio1.
Concludendo. Gli esempi esibiti di tipo didattico, pur nella loro semplicità, mi sembrano significativi. Chi non si limita a goderli passivamente ma ne comprende il meccanismo può eventualmente migliorarli e/o adattarli a proprie necessità, soprattutto agendo sui vari parametri.
Nota. Ciò vale specialmente per la condizione che discrimina le celle da assoggettare a lampeggio, che nel modello, per semplicità, considera solo il caso di valori positivi...
?>