Hi ha dos tipus d'esdeveniments que podeu utilitzar a la programació de VBA per a Excel 2016 que no estan associats amb objectes: temps i prems de tecles. Com que el temps i les pulsacions de tecles no estan associats amb un objecte concret, com ara un llibre o un full de treball, programeu aquests esdeveniments en un mòdul VBA normal.
L'esdeveniment OnTime
L'esdeveniment OnTime es produeix quan es produeix una determinada hora del dia. L'exemple següent mostra com aconseguir que Excel executi un procediment quan es produeix l'esdeveniment de les 15:00. En aquest cas, una veu de robot us diu que us desperteu, acompanyada d'un missatge:
Sub SetAlarm()
Application.OnTime 0.625, "DisplayAlarm"
End Sub
Sub DisplayAlarm()
Application.Speech.Speak ("Ei, desperta")
MsgBox "És l'hora del descans de la tarda!"
End Sub
En aquest exemple, s'utilitza el mètode OnTime de l'objecte Aplicació. Aquest mètode pren dos arguments: l'hora (0,625 o 3:00 pm) i el nom del procediment Sub que s'executa quan es produeix l'esdeveniment horari (DisplayAlarm).
Aquest procediment és molt útil si tendeix a estar tan embolicat en la vostra feina que us oblideu de reunions i cites. Només has de configurar un esdeveniment OnTime per recordar-te.
A la majoria de la gent li costa pensar en el temps en termes del sistema de numeració Excel. Per tant, és possible que vulgueu utilitzar la funció TimeValue de VBA per representar l'hora. TimeValue converteix una cadena que sembla un temps en un valor que Excel pot gestionar. La següent declaració mostra una manera més fàcil de programar un esdeveniment per a les 3 de la tarda:
Application.OnTime TimeValue ("3:00:00 pm"), "DisplayAlarm"
Si voleu programar un esdeveniment en relació a l'hora actual (per exemple, d'aquí a 20 minuts), podeu utilitzar una declaració com aquesta:
Application.OnTime Now + TimeValue ("00:20:00"), "DisplayAlarm"
També podeu utilitzar el mètode OnTime per executar un procediment VBA en un dia concret. Heu d'assegurar-vos que el vostre ordinador segueix funcionant i que el llibre de treball amb el procediment es manté obert. La declaració següent executa el procediment DisplayAlarm a les 5 de la tarda del 31 de desembre de 2016:
Application.OnTime DateValue ("31/12/2016 17:00"), "DisplayAlarm"
Aquesta línia de codi en particular pot ser útil per advertir-vos que heu d'anar a casa i preparar-vos per a les festes de Cap d'Any.
Aquí hi ha un altre exemple que utilitza l'esdeveniment OnTime. L'execució dels procediments UpdateClock escriu l'hora a la cel·la A1 i també programa un altre esdeveniment cinc segons més tard. Aquest esdeveniment torna a executar el procediment UpdateClock. L'efecte net és que la cel·la A1 s'actualitza amb l'hora actual cada cinc segons. Per aturar els esdeveniments, executeu el procediment StopClock (que cancel·la l'esdeveniment). Tingueu en compte que NextTick és una variable de nivell de mòdul que emmagatzema l'hora del següent esdeveniment.
Dim NextMarqueu com a data
Sub UpdateClock()
' Actualitza la cel·la A1 amb l'hora actual
ThisWorkbook.Sheets(1).Range(“A1”) = Temps
Configura el següent esdeveniment d'aquí a cinc segons
NextTick = Ara + TimeValue ("00:00:05")
Application.OnTime NextTick, "Actualitzar rellotge"
End Sub
Sub StopClock ()
' Cancel·la l'esdeveniment OnTime (atura el rellotge)
En cas d'error Reprèn Següent
Application.OnTime NextTick, "UpdateClock", , False
End Sub
L'esdeveniment OnTime persisteix fins i tot després de tancar el llibre de treball. En altres paraules, si tanqueu el llibre de treball sense executar el procediment StopClock, el llibre de treball es tornarà a obrir en cinc segons (suposant que Excel encara s'està executant). Per evitar-ho, utilitzeu un procediment d'esdeveniment Workbook_BeforeClose que contingui la instrucció següent:
Truqueu a StopClock
El mètode OnTime té dos arguments addicionals. Si teniu previst utilitzar aquest mètode, hauríeu de consultar el sistema d'ajuda per obtenir els detalls complets.
Si voleu veure una aplicació força complicada, consulteu aquesta aplicació de rellotge analògic. La cara del rellotge és en realitat un gràfic, i el gràfic s'actualitza cada segon per mostrar l'hora del dia. Inútil, però divertit.
Una aplicació de rellotge analògic.
Esdeveniments de premsa de tecles
Mentre treballeu, Excel supervisa constantment el que escriviu. Per això, podeu configurar les coses perquè una tecla o una combinació de tecles executi un procediment.
Aquí teniu un exemple que reasigna les tecles PgDn i PgUp:
Sub Setup_OnKey()
Aplicació.OnKey “{PgDn}”, “PgDn_Sub”
Aplicació.OnKey “{PgUp}”, “PgUp_Sub”
End Sub
Sub PgDn_Sub()
En cas d'error Reprèn Següent
ActiveCell.Offset(1, 0).Activar
End Sub
Sub PgUp_Sub()
En cas d'error Reprèn Següent
ActiveCell.Offset(-1, 0).Activar
End Sub
Després de configurar els esdeveniments OnKey executant el procediment Setup_OnKey, prement PgDn us mou una fila cap avall. Si premeu PgUp, us mourà una fila cap amunt.
Tingueu en compte que els codis clau es troben entre claus, no entre parèntesis. Per obtenir una llista completa dels codis del teclat, consulteu el sistema d'ajuda. Cerca OnKey.
En aquest exemple, On Error Resume Next s'utilitza per ignorar els errors que es generin. Per exemple, si la cel·la activa es troba a la primera fila, intentar moure una fila cap amunt provoca un error que es pot ignorar amb seguretat. I si un full de gràfic està actiu, no hi ha cap cel·la activa.
En executar la rutina següent, cancel·leu els esdeveniments OnKey:
Sub Cancel_OnKey()
Application.OnKey “{PgDn}”
Application.OnKey “{PgUp}”
End Sub
L'ús d'una cadena buida com a segon argument per al mètode OnKey no cancel·la l'esdeveniment OnKey. Més aviat, fa que Excel simplement ignori la pulsació de tecla. Per exemple, la declaració següent indica a Excel que ignori Alt+F4. El signe de percentatge representa la tecla Alt:
Application.OnKey “%{F4}”, ““
Tot i que podeu utilitzar el mètode OnKey per assignar una tecla de drecera per executar una macro, hauríeu d'utilitzar el quadre de diàleg Opcions de macro per a aquesta tasca.
Si tanqueu el llibre de treball que conté el codi i deixeu Excel obert, el mètode OnKey no es restablirà. Com a conseqüència, si premeu la tecla de drecera, Excel obri automàticament el fitxer amb la macro. Per evitar que això passi, hauríeu d'incloure codi al codi d'esdeveniment Workbook_BeforeClose per restablir l'esdeveniment OnKey.