Giocare e vincere con Excel

Immagini 3D

Per utilizzare una grafica tridimensionale sul proprio foglio di Excel è necessario gestire moltissime informazioni riguardo alla scena che si vuole rappresentare, a partire dal punto di vista e dalle posizioni nello spazio tridimensionale dei vertici di tutte le figure che si devono proiettare sullo schermo. Oltre a una base di dati molto complessa dove tracciare tutte le informazioni riguardanti la scena, è necessaria anche una discreta potenza di calcolo. Proprio per questo motivo, i giochi tridimensionali più affermati utilizzano delle librerie grafiche, che consentono di sfruttare appieno la potenza degli acceleratori presenti in tutte le moderne schede video. La mole di calcoli e la velocità necessarie per rendere un effetto realistico non consentono di realizzare gli stessi effetti semplicemente utilizzando il VBA di Excel.
È invece possibile creare e gestire su un foglio di lavoro degli oggetti tridimensionali sfruttando le caratteristiche grafiche del programma.
L’esempio che segue è ancora una volta basato su un’idea di Carlos Rondão. Si tratta di utilizzare le forme di Excel e di aggiungere a queste la terza dimensione mediante l’utilizzo della barra dei comandi Impostazioni 3D, attivabile con un pulsante a partire dalla barra Disegno.

Figura 13

Si parte disegnando una forma qualsiasi (per esempio un rettangolo) e attraverso la barra Impostazioni 3D si aggiunge la terza dimensione, si imposta la direzione di illuminazione e lo spessore dell’oggetto. Con pochi e semplici passaggi si ottiene l’oggetto rappresentato in Figura 14.

Figura 14

In Figura 15 sono invece mostrate alcune delle opzioni configurabili nella barra Impostazioni 3D.
Ovviamente le capacità di Excel nella rappresentazione di oggetti 3D sono limitate, ma comprendono tutti gli elementi di base per costruire strutture interessanti e gradevoli. In queste pagine vedremo solo come muovere questi oggetti, lasciando al lettore il compito di inventare nuovi modi per utilizzare questa tecnica al fine di creare immagini più complesse.

Figura 15

Vediamo ora il codice per muovere la “scatola” appena costruita. La premessa fondamentale per comprendere il codice è che al parallelepipedo è stato associato il nome figura.Il codice è costituito da due elementi:

il primo si trova all’interno del modulo Modulo1;

il secondo è associato ai pulsanti e risiede fisicamente all’interno dello spazio del codice associato al foglio di lavoro Foglio1.

Vediamo il codice presente in Modulo1:

Sub CliccaFigura()
Dim NomeShape As String, I As Integer, c As Integer
NomeShape = Application.Caller
With ActiveSheet.Shapes(NomeShape)
   If RootX = 0 Then RotX = -5
   If RotY = 0 Then RotY = 5
   RotX =  -RotX
   RotY = -RotY
   c = .Fill.ForeColor.SchemeColor
   c = c + 1
   If c = 8 Then c = 2
   .Fill.ForeColor.SchemeColor = c
End With
End Sub

Il codice presenta una prima parte di dichiarazione che definisce tre variabili:

• l’angolo di rotazione lungo l’asse X (RotX);

• l’angolo di rotazione lungo l’asse Y (RotY);

• una variabile di controllo del flusso della macro (FINECOMPITO).

Queste variabili saranno utilizzate sia nel codice sottostante sia nella seconda parte del codice.
La procedura CliccaFigura() è chiamata ogni volta che con il mouse si fa clic con il pulsante sinistro sulla scatola in movimento. Questa procedura gestisce l’interattività con l’utente. La procedura cambia verso di rotazione sia sull’asse X sia sull’asse Y e modifica il colore della figura (.Fill.ForeColor.SchemeColor), facendo ruotare i colori tra il codice 2 e il codice 8. Si noti l’uso del comando with per evitare di ripetere a ogni riga il codice ActiveSheet.Shapes(NomeShape).
Per fare in modo che a ogni clic sulla figura corrisponda l’esecuzione della macro CliccaFigura() bisogna associare alla figura stessa la macro come mostrato in Figura 16.

Figura 16

Vediamo ora la seconda parte del codice, che esegue effettivamente la rotazione della figura.

Vate Sub INIZIO_Click()
…T
…Tint
…NomeShape As String
ECOMPITO = False
eShape = “figura”
  0.1
Le Not FINECOMPITO
Init = Timer
Ith ActiveSheet.Shapes (NomeShape)
IncrementRotation (5)
F Abs (.Threed.RotationX + RotX) < 51 Then .ThreeD.IncrementRotationX (RotX)
F Abs (.Threed.RotationY + RotY) < 51 Then .ThreeD.IncrementRotationY (RotY)
Hile Timer <TInit + T
   DoEvents
End
Nd With
D
   Sub

Vate Sub FINE_Click()
ECOMPITO = True
   sub

Per prima cosa notiamo che questa parte si trova all’interno di Foglio1. Questo per mostrare come non sia necessario creare un modulo ogni volta che si inserisce del codice.Il codice inserito in questo spazio può essere attivato anche a seguito di eventi che avvengono all’interno del foglio di lavoro. Ogni volta che si compie un’azione su un foglio, come spostare il cursore, modificare una cella, fare clic con il mouse e così via, Excel va a verificare all’interno di questo spazio se esiste una porzione di codice corrispondente all’evento. Nel caso la trovi, la esegue all’istante. Nel nostro esempio abbiamo sfruttato questa funzionalità.I due pulsanti che compaiono nel foglio di lavoro sono stati nominati INIZIO e FINE. Al clic sul pulsante INIZIO viene eseguita la porzione di codice identificata all’interno della procedura Private Sub INIZIO_Click(). Alla pressione del pulsante FINE viene invece eseguita la porzione di codice presente nella procedura Private Sub FINE_Click().La procedura INIZIO_Click() definisce la variabile FINECOMPITO a False e poi entra in un ciclo infinito, dato che all’interno di tale ciclo non viene mai modificato il valore della variabile FINECOMPITO che consente di terminare il ciclo stesso. La variabile viene invece modificata da FINE_Click().La domanda che ci dobbiamo porre è: ma se sono all’interno del ciclo infinito di INIZIO_Click(), quando viene eseguita la routine FINE_Click()? Questo mistero si risolve pensando con una logica di esecuzione del codice non sequenziale ma a eventi: la routine di FINE viene eseguita al momento del clic sul pulsante corrispondente, interrompendo l’esecuzione del ciclo infinito. A questo punto, terminata la gestione dell’evento FINE_Click(), l’esecuzione del codice riprenderà il ciclo infinito di INIZIO_Click(), ma ora la variabile FINECOMPITO ha cambiato stato e dunque il ciclo non sarà più infinito, ma terminerà anch’esso.La garanzia che si possa fare clic sul pulsante FINE è data dal fatto che all’interno della gestione di INIZIO appare il comando DoEvents, che rende appunto possibile il gioco degli eventi appena descritto.Passiamo ora all’analisi del codice. Il codice permette di ruotare la scatola lungo tutti e tre gli assi con i comandi:

IncrementRotation per lʼasse Z;

ThreeD.RotationX per lʼasse X;

ThreeD.RotationY per lʼasse Y.

Il codice in se è molto semplice in quanto ruota la scatola lungo i tre assi a ogni ciclo e poi attende un decimo di secondo prima di eseguire la successiva rotazione. In questo tempo Excel si mette in ascolto dell’utente con l’istruzione DoEvents, mentre l’utente può fare clic su FINE oppure sulla scatola stessa. Nel primo caso interrompe la rotazione, mentre nel secondo fa eseguire la routine CliccaFigura() cambiando il colore alla scatola e il senso di rotazione.In Figura 17 potete apprezzare varie posizioni e colori della scatola durante l’esecuzione della macro.

Figura 17

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