Giocare e vincere con Excel

Gestire gli eventi di tastiera

La prima cosa da avere chiara è che il gioco deve girare all’interno di una macro, dunque non è possibile sfruttare la gestione della tastiera normale di Excel, per intenderci quella che usiamo quando scriviamo qualcosa in una cella o spostiamo il cursore nel foglio.
Per fare in modo che una macro di Excel rilevi gli eventi di tastiera (pressione e rilascio di un tasto) è necessario utilizzare una funzione di libreria di Windows:

Declare Function GetAsyncKeyState Lib “User32.dll” (ByVal vKey As Long) As
LongLa funzione GetAsyncKeyState appartiene alla libreria User32.dll

Questa, a sua volta, è una API (Application Programming Interface) di Windows. Le API sono uno strumento che ogni versione del sistema operativo Windows mette a disposizione. Esse permettono di accedere a funzionalità comuni a tutte le versioni del sistema sfruttandone appieno le potenzialità. Quella che sfrutteremo in questo caso è una semplice funzione che rileva lo stato (premuto o rilasciato) di ogni singolo tasto. La funzione restituisce un valore diverso da zero se il tasto è premuto nello stesso esatto momento in cui essa viene eseguita.

Il funzionamento di questa funzione è molto semplice. Richiede come argomento un numero intero che rappresenta il codice del tasto virtuale (Virtual-key Code) della tastiera. Per dirla in parole semplici, a ogni tasto corrisponde un numero, e la funzione GetAsyncKeyState interroga lo stato di quel tasto specifico che corrisponde al numero passatole. Il codice che rileva lo stato dei tasti è il seguente:

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 start()
Dim Direzione As String

While True
If GetAsyncKeyState(VK_LEFT) <> 0 Then 
     Direzione = “Sinistra”
   ElseIf GetAsyncKeyState(VK_RIGHT) <> 0 Then 
     Direzione = “Destra” 
   ElseIf GetAsyncKeyState(VK_UP) <> 0 Then 
     Direzione = “Su” 
   ElseIf GetAsyncKeyState(VK_DOWN) <> 0 Then 
     Direzione = “Giu” 
   Else 
     Direzione = “” 
   End If
Cells(1, 1) = Direzione
Wend
End Sub

La prima parte dichiara che nel codice verrà utilizzata la funzione e che quindi essa deve essere recuperata dalla corrispondente libreria. Si definiscono quindi delle costanti che rappresentano i codici di tasto virtuale appena discussi. Finalmente, si giunge al codice vero e proprio. Si tratta di un semplice ciclo perpetuo senza uscita dove t è sempre vero. Dunque, non si esce mai dal ciclo while-wend se non premendo Esc, cioè interrompendo l’esecuzione della macro. All’interno del ciclo vi è una variabile Direzione che assume il valore corrispondente alla freccia premuta. Nel ciclo (che data la velocità dei calcolatori attuali viene eseguito centinaia di volte al secondo) viene infatti verificata la pressione di quattro tasti: le quattro frecce di direzione. Nel caso in cui una determinata freccia sia premuta, la funzione GetAsyncKeyState corrispondente a quel tasto restituisce un valore diverso da zero, quindi viene eseguita la parte then del corrispondente if e la variabile Direzione assume il valore corrispondente alla freccia premuta. Tale valore viene poi presentato all’utente nella cella A1, (Cells(1,1)) del foglio di lavoro attivo.Non c’e’ nulla di più. Se volete verificare la pressione di un altro tasto oltre ai tasti freccia dovete solo reperire da Internet il codice del tasto virtuale corrispondente e aggiungere un altro if-then nel ciclo.


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