En muchísimas ocasiones (quizás mas de las deseadas), necesitamos si o si controlar la entrada de datos en nuestras planillas de cálculos. Las variaciones pueden ser miles: solo números, solo números mayores a cierta cifra, letras, ciertas letras (algunas sí, otras no), números y letras.... y podemos seguir combinando por varios años. En otros casos se nos presentará el siguiente problema: si los usuarios presionan "Control + P" quiero evitar que se imprima, o bien deseo evitar la combinación de ciertas teclas, como "Control + C".
En situaciones normales: ¿que sucede al presionar F1? Aparece la Ayuda. ¿F2? Entramos en el "modo edición" de celda. ¿F5? Aparece el cuadro "Ir a...". ¿Y si quiero personalizar dichas teclas y que, por ejemplo, si presionan F1 se agregue una nueva hoja al libro?
en mas de una ocasión nos vemos en la necesidad de colocar "controles de formularios" (activex) dentro del proyecto, para así chequear que datos ingresan los usuarios, mediante el uso de sus eventos KeyAscii y/o KeyDown. A partir de ahora nos será factible prescindir de ellos.
[+/-] Ver el resto / OcultarTrabajaremos sobre un evento del objeto Application llamado "OnKey". Como siempre aviso, mucho cuidado al trabajar con Application, ya que cualquier cambio que hagamos será reflejado en todos los libros de Excel. Lo mas conveniente es que luego de activar/desactivar alguna característica del objeto Application, reversemos la acción llevada a cabo. Ejemplo: si modifico una propiedad de alguna Hoja (Worksheet), los cambios se aplicarán solo a ella, omitiendo al resto. Idem si trabajo con Workbook (libro) o bien alguna celda o rango (range). Por el contrario, Application es sinónimo de Excel: cuidado, por que los cambios los heredarán todos los Libros y objetos de la aplicación.
Aclarado el punto anterior, volvamos a OnKey, analizando su sintaxis:
Application.OnKey (Key as String, [Procedimiento])
Este método posee dos argumentos: uno obligatorio (key) y otro [opcional] (procedimiento). El primero de ellos hace referencia, lisa y llanamente, a la tecla presionada, así de sencillo. El segundo es el nombre del procedimiento al que invocaremos si el usuario presiona la tecla en cuestión.
Veamos un ejemplo muy simple: si detectamos que presionaron F1, llamamos a un Sub que cierra el libro:
Application.OnKey "{F1}", "CerrarLibro"
Si, así de sencillo. Vean que la tecla se escribe directamente por su nombre, encerrada entre comillas y corchetes. El nombre del procedimiento, solamente entre comillas. Desde ya que "CerrarLibro" sera un procedimiento común y corriente, que deberá (en este caso) poseer el siguiente código:
Public Sub CerrarLibro()
ActiveWorkbook.Close
End Sub
O bien podríamos usar a F5 para colocar otra hoja en el libro:
Application.OnKey "{F5}", "NuevaHoja"
Public Sub CerrarLibro()
Sheets.Add
End Sub
Los ejemplos son simples y cortos, para ir entrando en tema. Como todo en Excel, no bastará una entrada para detallar completamente el tema, pero siempre queda abierta a las consultas de mis lectores.
Pero.. atención. Termino de ordenarle a Excel que cada vez que presionen F5 se dispare una macro. O sea que F5 nos queda inhabilitada de su función natural. Para regresarla a su estado original será necesario invocar nuevamente a OnKey, de esta forma:
Application.OnKey "{F5}"
Y listo. Con solo pasar el primer argumento F5 retomará su comportamiento habitual (Ir a...).
También tendremos la posibilidad de inhabilitar una determinada tecla. Supongamos que, por el motivo que sea, debemos impedir que se ingrese la letra "P" (pé mayúscula) en la hoja. La sintaxis es:
Application.OnKey "{P}", ""
El segundo argumento es una cadena vacía (doble comillas). Con esto deshabilitamos la letra P y cada vez que sea presionada... no pasará nada.
Como vengo diciendo: no olviden restaurar a P (o la tecla que sea) ya que quedará nula a menos que revirtamos el código creado.
Siguiendo con la tesitura, vamos a diseñar un ejemplo simple que deshabilitará un par de teclas al ingresar a una hoja. Y acorde a lo mencionado, las rehabilitaremos al abandonar dicha hoja:
Private Sub Worksheet_Activate() 'cuando el usuario entre a esta hoja, le ordeno a Excel 'que anule las teclas: F1, F2, Enter (~) y Suprimir (delete) Application.OnKey "{F1}", "" Application.OnKey "{F2}", "" Application.OnKey "{~}", "" Application.OnKey "{DELETE}", "" End Sub Private Sub Worksheet_Deactivate() 'y cuando nos vamos, las volvemos a su estado original, 'cosa que se logra omitiendo el segundo argumento: Application.OnKey "{F1}" Application.OnKey "{F2}" Application.OnKey "{~}" Application.OnKey "{DELETE}" 'al abandonar esta hoja, las teclas volveran a funcionar 'normalmente. End Sub
Si en vez de anular las teclas hubiésemos querido asignar macros a cada una de las teclas mencionadas, solo debemos indicarlo en el segundo argumento. Ejemplo:
Private Sub Worksheet_Activate() 'cuando el usuario entre a esta hoja, le ordeno a Excel 'que refuncionalice las teclas: F1, F2, Enter (~) y Suprimir (delete), a los fines 'de que cada una de ellas ejecute una macro "x" Application.OnKey "{F1}", "abrirLibro" Application.OnKey "{F2}", "eliminarHoja" Application.OnKey "{~}", "eliminarColumna" Application.OnKey "{DELETE}", "agregarFila" End Sub Private Sub Worksheet_Deactivate() 'y cuando nos vamos, las volvemos a su estado original, 'cosa que se logra omitiendo el segundo argumento: Application.OnKey "{F1}" Application.OnKey "{F2}" Application.OnKey "{~}" Application.OnKey "{DELETE}" 'al abandonar esta hoja, las teclas volveran a funcionar 'normalmente. End Sub
¿Vamos entrando en calor? Bien, por que hay que seguir. Vimos como activar a OnKey y los parámetros necesarios, destacando que es esencial devolver sus funciones naturales a cada tecla. Hemos visto también que es factible "disparar" una macro con la sola presión de una tecla. Podemos adaptar el teclado del ordenador a nuestras propias necesidades, sin importar cuales sean estas.
OnKey también soporta, como no podría ser de otra forma, la combinación de teclas, como por ejemplo "ctrol + alt + p", "ctrol + shift + w", el famoso "ctrol + alt + delete" o la que armemos de acuerdo a los requerimientos del proyecto. Para especificar correctamente la combinación a utilizar, necesitamos colocar ciertos caracteres especiales:
"Control" = ^ (signo exponencial)
"Alt" = % (signo de porcentaje)
"Mayusculas" = + (signo mas)
Bajo circunstancias normales, la combinación de "Control + P" nos abre el cuadro de diálogo "Imprimir". Supongamos que necesitamos que dicha combinación deje de funcionar como lo hace siempre, por que nuestro proyecto requiere que "Control + P" previamente elimine la primer fila de la hoja, establezca un área de impresión determinada, coloque la fecha actual en A1 y finalmente imprima la hoja actual.
El código sería:
Private Sub Worksheet_Activate() 'cuando el usuario activa la hoja, le digo a Excel que 'la combinación Control + P ya no funcionará como lo hace siempre: 'ahora llamará a la macro "ImpresionPersonalizada" Application.OnKey "+{p}", "ImpresionPersonalizada" End Sub Private Sub ImpresionPersonalizada() 'borro la primer fila Cells(1, 1).EntireRow.Delete 'establezco un area de impresión: ActiveSheet.PageSetup.PrintArea = "$A$1:$F$10" 'coloco la fecha actual en A1 Cells(1, 1).Value = Date 'y finalmente imprimo: ActiveSheet.PrintOut End Sub Private Sub Worksheet_Deactivate() 'al abandonar la hoja, vuelvo a "control + p" a 'su estado original Application.OnKey "+{p}"
End Sub
Si la combinación que deseamos armar es aún mas compleja, involucrando a "control" y "alt", solo tenemos que agregar el caracter correspondiente:
Si la combinación que deseamos armar es aún mas compleja, involucrando a "control" y "alt", solo tenemos que agregar el caracter correspondiente:
Application.OnKey "^%{p}"
En la ayuda de VBA coloquen "onkey" dentro del cuadro de búsqueda y tendrán a su alcance una buena tabla, con el detalle de como invocar de forma correcta a cada tecla, ya que cada una de ellas tiene (lógicamente) un nombre específico.
Siempre coloqué los ejemplos dentro del evento que se produce al activar o desactivar una hoja, pero este método puede ser llamado desde cualquier parte. Generalmente se usa mucho al abrir el libro (Workbook_Open) y al cerrarlo (WorkBook_Close), o bien desde otra macro.
Ya podemos evitar que copien, peguen, impriman; sabemos como desactivar teclas a nuestro antojo o crear combinaciones a nuestro parecer, junto a la llamadas a macros por parte de teclas específicas... todo esto con la utilización de un solo método: OnKey, el cual puede llegar a potenciar en gran medida nuestros proyectos, dandoles un buen toque profesional.
Esta vuelta no les dejo archivos para descargar: para los que no están "duchos" en el manejo de OnKey les conviene empezar con lo mas básico, ir paso x paso, no olvidando volver a cada tecla afectada a su función original.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
como puedo ingresar la fecha actual automaticamente pero que no se actualice tal como si usara la combinación ctrl+;
ResponderEliminarsi pones la función =HOY() en cualquier celda, esta se actualizará automaticamente cada vez que se recalcule el libro.
ResponderEliminarse me ocurren dos opciones:
1) menú herramientas/opciones/pestaña calcular. seleccionas la opcion "manual". esto hará que excel deje de calcular automaticamente, pero si tienes funciones.... dejarán de andar. y tiene el gran problema que la fecha se actualizará apenas se recalcule el libro. considero muy mala esta opción, estimo que vos necesitas guardar una fecha determinada y que esta no varíe nunca.
2) no queda otra que recurrir a las macros. te vas a VBA (alt + f11) y haces click sobre el objeto ThisWorkbook para abrir la ventana de código y pegás esto:
Private Sub Workbook_Open()
range("a1").value = date
End Sub
¿que hace esto? cada vez que se abra el libro colocará la fecha del sistema en la celda A1. deberías cambiar el nombre del rango por el que vos necesites en tu proyecto.
espero que te sirva, cualquier cosa me avisas, pero creo que la única solución es mediante macros, ya que una función si o si se actualizará cada vez que recalcules el libro.
si necesitas mas ayuda al respecto quedo al aguardo de tus noticias.