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

Lampeggio di celle, in vari modi

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...

?>

posted on domenica 8 novembre 2009 11.54