TL;DR —
Workbook_Openes un procedimiento de evento: Excel lo llama por ti en el momento en que el archivo termina de abrirse, así que una macro puede ejecutarse sola sin botón y sin ninguna acción del usuario. Dos cosas lo hacen funcionar o lo rompen. Primero, debe vivir en el objetoThisWorkbook, no en unModuleestándar — pégalo enModule1y sencillamente nunca se dispara. Segundo, solo se ejecuta cuando las macros están habilitadas y el archivo es un libro con macros habilitadas (.xlsm/.xlsb); si el usuario lo abre con las macros bloqueadas, no pasa nada y no se muestra ningún error.
' Este código vive en el objeto ThisWorkbook (haz doble clic en "ThisWorkbook"
' en el Explorador de proyectos — NO en Module1).
Private Sub Workbook_Open()
Worksheets("Dashboard").Activate
Range("A1").Select
MsgBox "Welcome back — data last refreshed " & Format(Now, "dd mmm, hh:nn")
End Sub
La mayoría de las macros esperan a un botón, un atajo o el cuadro de diálogo Macros.
Una macro de evento es distinta: nunca la llamas — la registras, y Excel la
ejecuta cuando ocurre algo. Workbook_Open es el primer evento que conoce la mayoría
de la gente, porque «haz esto cada vez que se abra el archivo» es una necesidad muy
común: saltar al panel, actualizar una consulta, preparar la interfaz, sellar un
registro de apertura. Es también el evento que a más gente se le resiste — casi
siempre por una de dos razones que este artículo deja imposibles de pasar por alto.
Lo que aprenderás
- El modelo mental — un manejador de eventos que registras, no una macro que ejecutas
- La única regla que lo decide todo — el código debe vivir en
ThisWorkbook - Por qué nunca se ejecuta en silencio — la seguridad de macros y el formato de archivo equivocado
Workbook_Openfrente al veteranoAuto_Open, y cuál usar- Por qué el código de evento debe ser rápido y a prueba de fallos — saluda al usuario en cada apertura
El modelo mental: un manejador de eventos que registras, no una macro que ejecutas
Una macro normal es un verbo que invocas: pulsas un botón y se ejecuta Sub RefreshData. Un procedimiento de evento es lo contrario — lo escribes una vez,
lo colocas en un sitio concreto con un nombre exacto, y luego es Excel quien decide
cuándo llamarlo. Tú no ejecutas Workbook_Open; le prometes a Excel «esto es lo que
hay que hacer cuando se abra este libro», y Excel cumple esa promesa por ti.
Eso le da la vuelta a cómo piensas en «dónde va este código». En una macro normal, la
ubicación apenas importa. En un evento, la ubicación es el registro. Excel busca
Workbook_Open exactamente en un sitio —el propio módulo de código del libro, llamado
ThisWorkbook— y en ningún otro. El nombre y el lugar, juntos, son todo el contrato.
La regla que lo decide todo: debe vivir en ThisWorkbook
Esta es la razón número uno por la que un Workbook_Open «no funciona»: el código se
pegó en un módulo estándar. Workbook_Open es un miembro del objeto Workbook, así
que su manejador tiene que vivir en el módulo de código del libro —ThisWorkbook—, no
en Module1.
Explorador de proyectos (Ctrl+R en el editor de VBA)
└─ VBAProject (TuArchivo.xlsm)
├─ Objetos de Microsoft Excel
│ ├─ Sheet1 (Sheet1) ← aquí van los eventos de hoja
│ └─ ThisWorkbook ← Workbook_Open va AQUÍ (haz doble clic)
└─ Módulos
└─ Module1 ← un Workbook_Open aquí NUNCA se dispara
Hay una forma rápida de acertar el esqueleto siempre: abre el panel de código de
ThisWorkbook, elige Workbook en la lista desplegable izquierda (Objeto) y luego
Open en la derecha (Procedimiento). Excel escribe la firma exacta por ti:
Private Sub Workbook_Open()
End Sub
La firma es fija. Es Private Sub Workbook_Open(): sin argumentos, escrito exactamente
así, en ThisWorkbook. Renómbralo, añádele un parámetro o muévelo y deja de ser el
manejador de eventos para convertirse en un sub corriente (que nunca se llama). La
regla: si una macro de apertura automática no se dispara, revisa primero su
ubicación — el 90% de las veces está en un Module en lugar de en ThisWorkbook.
La regla de por qué nunca se ejecuta en silencio: las macros deben estar habilitadas
Incluso en el sitio correcto, Workbook_Open solo se ejecuta si Excel tiene permiso
para ejecutar macros — y cuando no lo tiene, no hay ni aviso ni error. Tres cosas lo
desactivan sin hacer ruido:
- El archivo no admite macros. El VBA solo sobrevive en
.xlsmo.xlsb. Guarda como.xlsxnormal un libro que tenga código y Excel elimina todas las macros —incluidaWorkbook_Open— con apenas un aviso de pasada. El evento simplemente desaparece. - Las macros están deshabilitadas por seguridad. Si el usuario abre el archivo y lo deja en Vista protegida, o pasa de largo de la barra «Habilitar contenido» sin habilitar, las macros no se ejecutan, así que el evento no se dispara.
- Los eventos están apagados a nivel de aplicación. Si algún código anterior puso
Application.EnableEvents = Falsey nunca lo restauró, los eventos de libro y de hoja quedan suprimidos durante toda la sesión.
La lección de diseño importa: nunca hagas que la corrección de los datos dependa solo
de Workbook_Open. Es perfecto para la comodidad —saltar a una hoja, actualizar una
vista—, pero si un usuario abre el archivo con las macros apagadas, tu código «que
siempre se ejecuta» no lo hizo. Trátalo como un extra que mejora la experiencia, no
como una garantía. (Si lo único que quieres es que los usuarios superen la barra de
seguridad, mira cómo activar macros en Excel.)
Workbook_Open frente a Auto_Open: usa el evento, no la reliquia
Verás dos formas de ejecutar código al abrir, y no son lo mismo:
Auto_Openes el mecanismo veterano (de la época de Excel 5/95). Es un simpleSub Auto_Open()que vive en un Module estándar. Todavía funciona por compatibilidad hacia atrás, pero es una reliquia.Workbook_Openes el evento moderno, que vive enThisWorkbook.
Se diferencian de formas que hacen daño:
Workbook_Open (evento) |
Auto_Open (veterano) |
|
|---|---|---|
| Dónde vive | ThisWorkbook |
un Module estándar |
Se dispara con Workbooks.Open (abierto por código) |
Sí | No (necesita .RunAutoMacros) |
| Si existen ambos | se ejecuta primero | se ejecuta después |
| Estado | actual, recomendado | solo compatibilidad hacia atrás |
El que hay que recordar: si otra macro abre tu archivo con
Workbooks.Open "Report.xlsm", Workbook_Open se dispara pero Auto_Open no
(a menos que llames explícitamente a wb.RunAutoMacros xlAutoOpen). Esa diferencia,
por sí sola, es la razón por la que las canalizaciones automatizadas se rompen con
Auto_Open. Escribe Workbook_Open; recurre a Auto_Open solo para mantener
archivos muy antiguos.
La regla que evita que arruine cada apertura: sé rápido y a prueba de fallos
Workbook_Open se ejecuta antes de que el usuario pueda hacer nada — así que, haga
lo que haga, el usuario lo percibe como «cuánto tarda en abrirse el archivo» y «si el
archivo siquiera se abre sin problemas». Dos hábitos lo mantienen civilizado:
Private Sub Workbook_Open()
On Error GoTo Fail ' nunca dejes que la apertura falle en las narices del usuario
Application.ScreenUpdating = False
Worksheets("Dashboard").Activate
Range("A1").Select
Application.ScreenUpdating = True
Exit Sub
Fail:
Application.ScreenUpdating = True ' restaura siempre el estado, incluso ante un error
MsgBox "Startup skipped: " & Err.Description, vbExclamation
End Sub
- Envuélvelo siempre en manejo de errores. Un error no controlado aquí le lanza al
usuario un error crudo de VBA a la cara en el instante en que abre el archivo, y
puede dejar apagados ajustes como
ScreenUpdatingoEnableEvents. Restaura el estado en el manejador. (Es la misma disciplina que se trata en VBA On Error.) - Deja fuera el trabajo pesado, o hazlo visible. Una consulta lenta o un bucle
grande en
Workbook_Opense ve exactamente igual que un archivo colgado. Si el trabajo es inevitable, muestra un mensaje de estado o muévelo detrás de un botón que el usuario decida pulsar.
Workbook_Open es uno más de toda una familia de eventos de libro —
Workbook_BeforeClose, Workbook_BeforeSave, Workbook_SheetChange—, todos viviendo
en ThisWorkbook. Sus primos a nivel de hoja reaccionan a lo que ocurre dentro de
una hoja: Worksheet_Change cuando se edita una celda,
y Worksheet_SelectionChange cuando se mueve
el cursor.
Cómo ayuda ExcelMaster
Montar Workbook_Open es un pequeño ritual con aristas afiladas: el objeto correcto,
el nombre exacto, un archivo con macros habilitadas, manejo de errores, no colgar la
apertura. Equivócate en cualquiera y el síntoma es el mismo e inútil «no pasó nada».
ExcelMaster
te deja describir el resultado en su lugar. Di «cada vez que se abra este archivo,
salta a la hoja Dashboard y actualiza la tabla dinámica», y escribe el manejador, lo
coloca en ThisWorkbook y lo envuelve para que un fallo no haga que la apertura se
caiga. El archivo sigue siendo tuyo y puedes leer cada línea — pero te ahorras la parte
en la que una macro se niega en silencio a ejecutarse porque acabó en Module1.
Preguntas frecuentes
¿Dónde va el código de Workbook_Open en Excel?
En el objeto ThisWorkbook, no en un módulo estándar. Abre el editor de VBA (Alt+F11),
busca ThisWorkbook bajo los «Objetos de Microsoft Excel» de tu proyecto, haz doble
clic y pon ahí Private Sub Workbook_Open(). Un sub Workbook_Open colocado en
Module1 se ve idéntico pero nunca se dispara, porque Excel solo busca el evento en el
propio módulo de código del libro.
¿Por qué no se ejecuta mi macro Workbook_Open?
Casi siempre por una de tres cosas: el código está en un Module en lugar de en
ThisWorkbook; el archivo se guardó como .xlsx (que elimina todas las macros) en vez
de .xlsm; o el usuario lo abrió con las macros deshabilitadas y no pulsó «Habilitar
contenido». Revisa primero la ubicación — es la causa más común. Confirma también que
ningún código anterior dejó Application.EnableEvents = False.
¿Cuál es la diferencia entre Workbook_Open y Auto_Open?
Workbook_Open es el evento moderno, que vive en ThisWorkbook. Auto_Open es la
macro veterana, que vive en un módulo estándar. La diferencia práctica clave:
Workbook_Open se dispara cuando otra macro abre el archivo (Workbooks.Open), pero
Auto_Open no lo hace a menos que llames a RunAutoMacros. Usa Workbook_Open;
conserva Auto_Open solo para mantener archivos antiguos.
¿Se ejecuta Workbook_Open cuando una macro abre el archivo?
Sí. Cuando el código ejecuta Workbooks.Open "Report.xlsm", el Workbook_Open de ese
libro se dispara con normalidad. Si necesitas suprimirlo específicamente —por ejemplo,
en un trabajo por lotes automatizado— pon Application.EnableEvents = False antes de la
llamada a Workbooks.Open y vuelve a ponerlo en True después.
¿Cómo abro un libro sin ejecutar Workbook_Open?
Mantén pulsada la tecla Shift mientras se abre el archivo para saltarte
Workbook_Open en esa apertura concreta. Desde código, pon
Application.EnableEvents = False antes de Workbooks.Open y restáuralo a True
después. Ambas cosas son útiles cuando una macro de arranque se está portando mal y
necesitas entrar en el archivo para arreglarla.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 02/08/2026.
Guías relacionadas: VBA Worksheet_Change · VBA Worksheet_SelectionChange · VBA On Error · VBA Workbook · Activar macros en Excel
