🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Atajos de teclado VBA en Excel — asignar atajos Ctrl+Mayús a macros con OnKey y MacroOptions

|

Atajos de teclado VBA en Excel — asignar atajos Ctrl+Mayús a macros con OnKey y MacroOptions

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.MacroOptions en código) se guarda dentro del libro y funciona mientras ese archivo está abierto; solo admite Ctrl+letra o Ctrl+Mayús+letra. Application.OnKey se 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 cada OnKey en Workbook_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 de Workbooks.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