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. 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. ![]() In Figura 15 sono invece mostrate alcune delle opzioni configurabili nella barra Impostazioni 3D. ![]() 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:
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:
Queste variabili saranno utilizzate sia nel codice sottostante sia nella seconda parte del codice. ![]() 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:
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. ![]()
| In questo articolo |