TL;DR — Excel tiene dos sistemas distintos para lanzar una macro desde el teclado. El atajo de Opciones de macro (Alt+F8 > Opciones, o
Application.MacroOptionsen código) se guarda dentro del libro y funciona mientras ese archivo está abierto; solo admite Ctrl+letra o Ctrl+Mayús+letra.Application.OnKeyse asigna por código, admite casi cualquier tecla, incluidas las de función, y dura toda la sesión de Excel, en todos los libros, hasta que la restableces. Usa Ctrl+Mayús+letra, porque Ctrl+letra sustituye en silencio el atajo propio de Excel, como Ctrl+C. Restablece cadaOnKeyenWorkbook_BeforeClose. Y si la macro abre un libro, espera primero a que se suelte la tecla Mayús, o Excel detendrá tu código justo después deWorkbooks.Open.
' Sistema 1: se guarda en el archivo, funciona mientras este libro este abierto
Application.MacroOptions Macro:="FormatReport", _
HasShortcutKey:=True, ShortcutKey:="R" ' R mayuscula = Ctrl+Shift+R
' Sistema 2: vive en la sesion de Excel hasta que se restablece
Application.OnKey "{F9}", "RefreshAll" ' asignar
Application.OnKey "{F9}" ' devolver a Excel su propio F9
Este es el primer artículo de una serie sobre macros que Excel ejecuta por ti: desde una tecla, desde el reloj con OnTime o desde pulsaciones simuladas con SendKeys. Las une una sola idea, y explica casi todas sus sorpresas: ninguna llama a tu macro directamente. Cada una deja una petición en la cola de Excel, y Excel la ejecuta solo cuando está libre y listo. Así que tienes que pensar en la cola: qué retiene una petición, qué la elimina y qué sigue esperando cuando se cierra el libro.
Lo que aprenderás
- El modelo mental: dos sistemas de atajos con distinto alcance y duración
- Asignar un atajo en el cuadro Macro y con
MacroOptions OnKey: los códigos de tecla y las tres formas de la llamada- Por qué Ctrl+letra es una trampa, y por qué Ctrl+Alt lo es con el teclado español
- La tecla Mayús que detiene una macro después de
Workbooks.Open - Limpiar para que una tecla no sobreviva a su libro
- Averiguar qué atajos tiene asignados un libro
El modelo mental: dos sistemas, dos duraciones
Cuando pulsas una tecla en Excel, Excel busca algo que ejecutar. Mira en dos sitios, y se comportan de forma muy distinta:
| Atajo de Opciones de macro | Application.OnKey |
|
|---|---|---|
| Se asigna con | Alt+F8 > Opciones, o MacroOptions |
código, normalmente en Workbook_Open |
| Se guarda | dentro del libro, junto a la macro | en ningún sitio; solo en el Excel en ejecución |
| Activo | mientras ese libro está abierto | toda la sesión, en todos los libros |
| Teclas | Ctrl+letra o Ctrl+Mayús+letra | casi cualquier combinación, teclas de función, Enter, Supr |
| Termina | cuando se cierra el libro | cuando lo restableces o se cierra Excel |
La columna de la izquierda es una propiedad del archivo. La de la derecha es un cambio en el propio Excel, hecho por tu código y que se queda ahí salvo que tu código lo deshaga. Casi todos los fallos con atajos vienen de olvidar cuál de los dos usaste.
Los dos sistemas comparten una regla de la serie: Excel solo atiende la tecla cuando está listo. Mientras una celda está en modo de edición, mientras hay un cuadro de diálogo o un UserForm modal abierto, o mientras se ejecuta otra macro, el atajo no hace nada.
Sistema 1: el atajo de Opciones de macro
La vía manual: pulsa Alt+F8, selecciona la macro, haz clic en el botón Opciones y escribe una letra en el campo Tecla de método abreviado. Una minúscula da Ctrl+letra; si mantienes Mayús mientras la escribes, obtienes Ctrl+Mayús+letra.
Lo mismo por código, útil cuando construyes o reparas un libro desde VBA:
Sub AssignReportShortcut()
Application.MacroOptions Macro:="FormatReport", _
Description:="Format the active report sheet", _
HasShortcutKey:=True, _
ShortcutKey:="R" ' "r" = Ctrl+R, "R" = Ctrl+Shift+R
End Sub
El atajo se guarda con el libro, así que guarda el archivo después. Funciona desde cualquier libro abierto mientras este siga abierto, y desaparece con el archivo. Por eso es la elección correcta para una macro que pertenece a un libro concreto: el atajo viaja con el archivo y se limpia solo.
Los límites: solo letras (nada de teclas de función ni Enter), ninguna combinación con Alt, y la macro tiene
que ser un Sub público sin argumentos en un módulo estándar.
Sistema 2: Application.OnKey
OnKey recibe un código de tecla y el nombre de un procedimiento:
Application.OnKey "^+r", "FormatReport" ' Ctrl+Shift+R
Application.OnKey "{F9}", "RefreshAll" ' F9
Application.OnKey "^{DEL}", "ClearInputs" ' Ctrl+Supr
El código de tecla usa tres caracteres de prefijo para los modificadores y llaves para las teclas con nombre:
| Código | Tecla |
|---|---|
^ |
Ctrl |
+ |
Mayús |
% |
Alt |
{F1} a {F15} |
teclas de función |
{ENTER} o ~ |
Enter (~ es la tecla Enter principal) |
{DEL}, {INSERT}, {HOME}, {END} |
teclas de edición |
{PGUP}, {PGDN}, {UP}, {DOWN} |
teclas de desplazamiento |
{ESC}, {TAB}, {BS} |
Esc, Tab, Retroceso |
La regla más importante es que el mismo método hace tres trabajos distintos, según el segundo argumento:
Application.OnKey "^+r", "FormatReport" ' dos argumentos: ejecuta esta macro
Application.OnKey "^+r", "" ' cadena vacia: la tecla no hace nada
Application.OnKey "^+r" ' sin segundo argumento: vuelve el comportamiento de Excel
Las dos últimas se confunden mucho. Para deshacer tu propia asignación necesitas la forma de un solo
argumento. La cadena vacía sirve para desactivar una tecla a propósito, por ejemplo
Application.OnKey "^x", "" para que nadie corte celdas en una plantilla, y la tecla sigue desactivada hasta
que algo la restablezca.
Ctrl+letra sustituye los atajos propios de Excel
Asigna una macro a Ctrl+C, Ctrl+G o Ctrl+Z y Excel no te avisa. Mientras el libro esté abierto, la tecla ejecuta tu macro en lugar de copiar, guardar o deshacer. Ctrl+Z es el peor caso: el usuario lo pulsa para deshacer un error, se ejecuta tu macro, y una macro tampoco se puede deshacer.
Casi todas las combinaciones Ctrl+letra ya las usa Excel. Ctrl+Mayús+letra casi nunca, y por eso la regla es sencilla: siempre Ctrl+Mayús+letra, en los dos sistemas.
Con el teclado español, y con el alemán, el francés y casi todos los europeos, hay una segunda trampa que te
toca de lleno. Para Windows, AltGr es Ctrl+Alt. Y en un teclado español media vida pasa por AltGr:
AltGr+2 escribe @, AltGr+E escribe €, AltGr+3 escribe #, y los corchetes salen con AltGr+y AltGr++. Una asignaciónOnKey "^%2"(Ctrl+Alt+2), escrita tranquilamente en un teclado estadounidense donde esa combinación no significa nada, captura esas pulsaciones en Madrid o en Bogotá, y de repente el usuario no puede escribir una dirección de correo. Lo mismo con"^%e"`: adiós al símbolo del euro en tu informe
financiero. Si el archivo se va a usar con teclados españoles o europeos, evita por completo las
combinaciones Ctrl+Alt.
La tecla Mayús que detiene una macro después de Workbooks.Open
Este aparece como mi macro se para a mitad cuando uso el atajo, pero funciona desde el botón Ejecutar. La macro tiene un atajo Ctrl+Mayús y abre un libro:
Sub ImportMonthly() ' asignada a Ctrl+Shift+I
Workbooks.Open "C:\Data\monthly.xlsx"
MsgBox "Imported" ' nunca se llega aqui desde el atajo
End Sub
Mantener Mayús pulsada mientras se abre un libro es la señal de Excel para saltarse las macros de inicio
de ese archivo. Cuando lanzas la macro con Ctrl+Mayús+I, tu dedo sigue en Mayús cuando se ejecuta
Workbooks.Open, y Excel termina el código en curso junto con las macros de inicio. Sin error, sin mensaje:
el código simplemente se detiene.
La solución es esperar a que se suelte Mayús antes de abrir nada:
#If VBA7 Then
Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#Else
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#End If
Private Const VK_SHIFT As Long = &H10
Sub ImportMonthly()
Do While GetKeyState(VK_SHIFT) < 0 ' negativo = Mayus esta pulsada
DoEvents
Loop
Workbooks.Open "C:\Data\monthly.xlsx"
MsgBox "Imported"
End Sub
La guía de DoEvents explica por qué el bucle necesita DoEvents: deja que Excel lea
que la tecla se ha soltado. Otra opción es dar a las macros que abren archivos un atajo sin Mayús mediante
OnKey, por ejemplo una tecla de función.
Limpiar: una tecla no debe sobrevivir a su libro
Una asignación de OnKey pertenece a Excel, no al libro. Cierra el libro y la tecla sigue apuntando a la
macro: al pulsarla, Excel puede volver a abrir tu archivo para ejecutarla, o fallar con Cannot run the macro
(No se puede ejecutar la macro). Así que el patrón siempre va en pareja, asignar al abrir y restablecer al
cerrar:
' En ThisWorkbook
Private Sub Workbook_Open()
Application.OnKey "{F9}", "RefreshAll"
Application.OnKey "^+r", "FormatReport"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey "{F9}" ' un argumento = restaurar el comportamiento por defecto
Application.OnKey "^+r"
End Sub
Si los usuarios trabajan con varios libros a la vez y las teclas solo deben valer en el tuyo, usa
Workbook_Activate y Workbook_Deactivate. Las guías de Workbook_Open y de
BeforeClose tratan esos eventos, incluido el caso en que el usuario
cancela el cierre.
Mantén la lista de teclas en un solo sitio, por ejemplo un procedimiento SetKeys(enable As Boolean) al que
llamen los dos eventos, para que una tecla añadida más tarde no se quede olvidada en el restablecimiento.
¿Qué atajos tiene este libro?
No hay ninguna propiedad que liste los atajos de Opciones de macro. Excel guarda cada uno como un atributo
oculto del procedimiento, que puedes ver si exportas el módulo (clic derecho > Exportar archivo) y abres el
archivo .bas en un editor de texto:
Sub FormatReport()
Attribute FormatReport.VB_ProcData.VB_Invoke_Func = "R\n14"
R es la tecla, y la mayúscula significa Ctrl+Mayús. La línea es invisible en el editor de VBA, y por eso un
atajo puede sobrevivir años después de que todo el mundo lo haya olvidado. Las asignaciones de OnKey no se
guardan en ningún sitio, así que la única lista es tu propio código de Workbook_Open: un motivo más para
tenerlas en un solo procedimiento.
La decisión de criterio: atajos de archivo para archivos, OnKey para herramientas
Usa el atajo de Opciones de macro para una macro que pertenece a un libro. Se guarda con el archivo, termina con el archivo y no necesita código de limpieza.
Usa OnKey solo cuando necesites lo que únicamente él ofrece: teclas de función y otras teclas que no son
letras, o un atajo que un complemento o Personal.xlsb proporciona en todos los libros. Y entonces trátalo
como un cambio en el Excel del usuario que tienes que deshacer, con un restablecimiento por cada tecla que
asignes.
En los dos casos: Ctrl+Mayús+letra, nunca Ctrl+letra, y nunca Ctrl+Alt en archivos que acaben en teclados españoles o europeos. Un atajo solo ayuda si no rompe una tecla de la que el usuario ya depende.
Cómo ayuda ExcelMaster
Los problemas con atajos cuestan de ver: la asignación es un atributo oculto o una línea en un procedimiento de evento, y el síntoma es una tecla que no copia nada o una macro que se para sin dar error.
ExcelMaster lee los módulos del
libro, lista cada atajo y cada asignación de OnKey que encuentra, señala los que anulan teclas propias de
Excel o nunca se restablecen, y puede escribir por ti la pareja correspondiente de Workbook_Open y
Workbook_BeforeClose.
Preguntas frecuentes
¿Cómo asigno un atajo de teclado a una macro en Excel?
Pulsa Alt+F8, selecciona la macro, haz clic en Opciones y escribe una letra en el campo Tecla de método
abreviado. Mantén Mayús mientras escribes la letra para obtener Ctrl+Mayús+letra, que evita sustituir los
atajos propios de Excel. Por código, usa Application.MacroOptions con HasShortcutKey:=True y
ShortcutKey:="R".
¿Qué diferencia hay entre OnKey y el atajo de una macro?
El atajo de Opciones de macro se guarda en el libro y funciona mientras ese archivo está abierto, pero solo
con letras. Application.OnKey se asigna por código, funciona con casi cualquier tecla, incluidas las de
función, y dura toda la sesión de Excel hasta que se restablece.
¿Cómo restablezco una tecla asignada con Application.OnKey?
Llama a OnKey solo con el código de tecla, por ejemplo Application.OnKey "{F9}". Pasar una cadena vacía
como segundo argumento no restablece la tecla: la desactiva.
¿Por qué mi macro se para después de Workbooks.Open cuando uso el atajo?
Mantener Mayús pulsada mientras se abre un libro le dice a Excel que se salte sus macros de inicio, y eso
también termina tu código en curso. Espera en un bucle con GetKeyState hasta que se suelte Mayús, o usa un
atajo sin Mayús.
¿Puedo usar las teclas de función como atajos de macro en Excel?
No desde el cuadro Opciones de macro, que solo acepta letras. Usa Application.OnKey "{F9}", "MyMacro" en
Workbook_Open, y restablécela con Application.OnKey "{F9}" en Workbook_BeforeClose.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 03/10/2026.
Guías relacionadas: VBA OnTime · VBA SendKeys · VBA Workbook_Open · VBA Workbook_BeforeClose · VBA DoEvents · VBA Open Workbook · VBA Application.Run · VBA Sub
