Giocare e vincere con Excel

Migliorare la grafica con le immagini

L’atra tecnica che si può sfruttare per gestire una grafica accattivante in Excel è quella suggerita da Carlos Rondão sul suo sito http://www.cyberbolsa.cea.ucp.pt/informatica/download. Carlos utilizza la tecnica degli shapes. In un foglio di Excel è possibile collocare vari oggetti oltre a formule e scritte. A noi interessa inserire un’immagine con il comando Inserisci > Immagine > Da file (Figura 8).

Figura 8

Una volta selezionata, l’immagine essa apparirà nella cartella di lavoro e farà parte integrante del foglio. Sarà tanto integrata che Excel stesso le darà un nome, come mostrato in Figura 9.

Figura 9

La faccina che sorride è inserita nel foglio e Excel le ha assegnato il nome “Immagine 1”. A questo punto potete rinominare l’immagine come meglio credete. Poiché tale oggetto ha un nome, è possibile riferirsi a esso all’interno del codice VBA:

Option Explicit
Declare Function GetAsyncKeyState Lib “User32.dll” (ByVal 
vKey As Long) As Long
Const VK_LEFT As Long = 37
Const VK_DOWN As Long = 40
Const VK_RIGHT As Long = 39
Const VK_UP As Long = 38
Const VK_Z As Long = 90
Const VK_SHIFT As Long = 16
Sub muovi_PALLA()
Dim a As Double
Dim TIMETOT As String
Dim T, TInit, TStep
Dim step As Integer
Dim Direzione As String
Dim raggio As Integer
Direzione = “”
raggio = 60
TIMETOT = 1
T = 0.03
TInit = Timer
a = 0
step = 2
While Timer < TInit + TIMETOT 
   DoEvents 
   Application.Interactive = False 
      If GetAsyncKeyState(VK_LEFT) <> 0 Then 
          Direzione = “Sinistra” 
          raggio = raggio - 1 
          If raggio < 10 Then raggio = 10 
      ElseIf GetAsyncKeyState(VK_RIGHT) <> 0 Then 
          Direzione = “Destra” 
          raggio = raggio + 1 
          If raggio > 100 Then raggio = 100 
      Else 
      Direzione = “” 
      End If 
   Cells(1, 1) = Direzione 
   Cells(3, 13) = raggio 
   a = a + 2 * 3.141592 / 360 * step 
   Worksheets(“Sheet1”).Shapes(“PALLA”).Top = Round(150 + 
   Sin(a) * raggio) 
   Worksheets(“Sheet1”).Shapes(“PALLA”).Left = Round(150 + 
   Cos(a) * raggio) 
   TStep = Timer 
   While Timer < TStep + T 
   Wend
Wend
Application.Interactive = True 

End Sub

Il codice è basato su un ciclo esterno di venti secondi regolabile con la variabile TIMETOT. L’animazione, dunque, durerà venti secondi; in questo tempo verrà eseguita continuativamente la parte interna del ciclo che muove la palla sullo schermo. La sua velocità di movimento è regolata attraverso un ciclo di ritardo dalla variabile T.
Nel ciclo while-wend vengono eseguite le seguenti azioni:

verifica della pressione dei tasti. Se sono state premuti i tasti Freccia destra e sinistra viene modificato il raggio del cerchio;

si calcola il nuovo angolo e si sposta la PALLA nella nuova posizione.

Per visualizzare il movimento della palla si utilizza il comando DoEvents, che consente a Excel di aggiornare la posizione della palla sullo schermo. Tale istruzione, però, permette anche all’utente di spostare il cursore, di inserire testi nelle celle, di interagire insomma con Excel esattamente come se la macro non ci fosse. Questo comporta un problema di gestione dell’interfaccia di importanza cruciale. È quindi necessario permettere a Excel di eseguire gli eventi (dunque di spostare l’oggetto) ma bisogna inibire l’interattività con l’utente. L’istruzione:

Application.Interactive = False

ha esattamente questo scopo.
Attenzione: se eseguite una macro con questa istruzione e non eseguite l’istruzione:

Application.Interactive = True

che riporta le cose alla normalità, non potrete più interagire con Excel!
L’unica alternativa che avrete a questo punto è chiudere Excel da Program Manager e ovviamente perdere tutto ciò che non era stato salvato. Fate quindi molta attenzione quando usate questi comandi ed evitate che la macro si interrompa a metà! In questo caso, infatti, sarà stato eseguito il comando:

Application.Interactive = False

ma non la sua controparte e dunque, anche se il codice fosse stato corretto, si avrebbe comunque la perdita della sessione aperta. Ci sono anche altri due modi per ottenere lo stesso risultato. La prima alternativa, meno piacevole dal punto di vista dell’esperienza di gioco, è quella di eliminare i comandi:

DoEvents;

Application.Interactive = True;

Application.Interactive = False.

e inserire al loro posto il comando Application.ScreenUpdating = True all’interno del ciclo while-wend. Questa istruzione esegue un refresh di tutto lo schermo (e non solo della palla) producendo un risultato analogo a DoEvents, ma con lo svantaggio che l’immagine diventa leggermente tremolante. Il vantaggio è che non si rischia di perdere il controllo di Excel.L’altra possibilità che ci sentiamo di consigliare per la gestione della tastiera è quella di lasciare il comando DoEvents senza però i due comandi Application.Interactive. In questa situazione l’utente può spostare il cursore tra le celle liberamente come se la macro non stesse funzionando. Si gestisce allora l’evento Worksheet_SelectionChange del foglio di lavoro per riportare sempre il cursore nella stessa cella (in questo caso E3):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range(“E3”).Activate
End Sub

Questo codice non deve essere inserito in un modulo ma nel foglio di lavoro nel quale si trova la palla (o il gioco da gestire) facendo doppio clic sul nome del foglio nell’area del progetto.
Anche questo metodo ha vantaggi e svantaggi: il vantaggio, ancora una volta, è che non si rischia di perdere il controllo di Excel; lo svantaggio è che anche quando la macro non funziona l’evento Worksheet_SelectionChange viene eseguito e il cursore resta incastrato sempre nella cella E3. La soluzione si complica, allora, perché bisogna avere una cella del foglio di lavoro controlli se la macro sia attivata o meno. Solo sapendo se la macro è in funzione è possibile definire il comportamento dell’evento incriminato, lasciando libero il cursore quando la macro è inattiva e invece incastrando il cursore quando la macro è attiva:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Cells(2, 2) = “On” Then Range(“E3”).Activate
End Sub

Ovviamente la cella (2,2) viene posta a “On” all’inizio della macro (cells(2,2)=”On”) e azzerata (Cells(2,2)=””) al termine della stessa. A voi resta solo la scelta di quale tecnica sia meglio utilizzare tra quelle esposte.Con poche modifiche al codice, seguendo la falsa riga di quanto fatto per gli sprite, potrete persino gestire le immagini in movimento: come per gli sprite, così per le immagini basta creare una sequenza di immagini leggermente diverse le une dalle altre, e periodicamente sostituire nella posizione dell’oggetto le immagini che lo costituiscono. L’effetto è assicurato!


xxx

Gianclaudio Floria - Autore top seller su Excel per Edizioni FAG, collabora con Microsoft ed è il fondatore del portale www.excelling.it
Andrea Terzaghi - Ingegnere con esperienza pluriennale nell'uso lavorativo e ludico di Excel; condivide trucchi e segreti sul suo sito www.terzaghi.it

Articolo tratto da:
Gianclaudio Floria, Andrea Terzaghi, Giocare e vincere con Excel, Assago (Milano), FAG, 2006.


In partnership con Fag
**
**
**
**

Risorse