Resumen (TL;DR) — VBA ofrece dos formas de decir «este archivo» y significan cosas distintas.
ThisWorkbookes el libro donde vive tu código: no cambia nunca, hagas lo que hagas.ActiveWorkbookes la ventana que está al frente ahora mismo: cambia en cuanto el usuario (o tu propia macro) cambia de archivo. Leer y escribir a través deActiveWorkbookes la mayor causa de que una macro corrompa o guarde el libro equivocado. Captura una referencia una sola vez —Set wb = ThisWorkbookoSet wb = Workbooks.Open(...)— y no vuelvas a confiar en «activo».
Un Workbook es la cúspide del modelo de objetos: el archivo en sí, lo que
contiene tus hojas. Casi todo error de «mi macro puso los datos en el archivo
equivocado» viene de una sola confusión: tratar el archivo donde está mi código y
el archivo que está al frente como si fueran el mismo. No lo son, y en ese hueco
es donde se pierden los datos.
Qué aprenderás
- La diferencia exacta entre
ThisWorkbookyActiveWorkbook(y cuándo usar cada uno) - Por qué
Workbooks.Opente entrega una referencia que deberías capturar de inmediato - La trampa de la extensión en
Workbooks("Data")detrás de «subíndice fuera del intervalo» - El único hábito que hace desaparecer los errores de libros
El modelo mental: «el archivo donde vivo» vs. «el archivo al frente»
Piensa en ThisWorkbook como la dirección de casa de tu macro: fija, escrita en la
escritura. ActiveWorkbook es «donde sea que esté parado ahora». En cuanto tu
código abre otro archivo, o el usuario hace Alt+Tab a otro libro, «donde estoy
parado» se mueve. Tu dirección de casa no.
Sub TwoMeaningsOfThisFile()
' ThisWorkbook = el archivo que contiene ESTE código. Siempre.
Debug.Print ThisWorkbook.Name ' p. ej. "Reports.xlsm"
' ActiveWorkbook = lo que esté al frente ahora mismo.
Debug.Print ActiveWorkbook.Name ' podría ser CUALQUIER archivo abierto
' Abre un segundo archivo — ahora ActiveWorkbook cambió bajo tus pies
Workbooks.Open "C:\data\Sales.xlsx"
Debug.Print ThisWorkbook.Name ' sigue siendo "Reports.xlsm"
Debug.Print ActiveWorkbook.Name ' ahora "Sales.xlsx" <-- ¡se movió!
End Sub
Por qué importa: la línea que abrió Sales.xlsx cambió en silencio a qué apunta
ActiveWorkbook. Si las siguientes 40 líneas de tu macro escriben a través de
ActiveWorkbook o de un Range(...) sin calificar, ahora caen en Sales.xlsx, no
en el archivo para el que escribiste el código. La macro no da error. Solo pone los
datos en el lugar equivocado.
La regla que evita desastres de archivo equivocado
Aquí está el modo de fallo dicho sin rodeos: cualquier código que dependa de
ActiveWorkbook está a un clic del usuario — o a un Workbooks.Open — de operar
sobre el archivo equivocado. La solución no es tener cuidado. La solución es dejar
de depender de «activo» por completo.
Sub SafeWorkbookHandling()
' Captura la referencia al abrir — no la vayas a buscar después
Dim wbSource As Workbook
Set wbSource = Workbooks.Open("C:\data\Sales.xlsx")
' ThisWorkbook para el archivo donde vive la macro
Dim wbReport As Workbook
Set wbReport = ThisWorkbook
' Ahora cada operación es explícita — sin ambigüedad, sin «activo»
wbReport.Worksheets("Summary").Range("A1").Value = _
wbSource.Worksheets("Data").Range("A1").Value
wbSource.Close SaveChanges:=False
End Sub
Workbooks.Open devuelve el libro que acaba de abrir. Capturarlo con
Set wb = Workbooks.Open(...) es la diferencia entre código robusto y una macro que
funciona en tu equipo y se rompe en el de otra persona. Lo mismo vale para
Workbooks.Add, que devuelve el libro nuevo en blanco.
Workbooks("Data") — la trampa de la extensión
Puedes tomar un libro ya abierto por su nombre desde la colección Workbooks, pero
la regla del nombre es sutil y causa un aluvión de preguntas de «subíndice fuera
del intervalo» (error de ejecución 9).
Sub WorkbookByName()
' ANTES de guardar el archivo, refiérelo SIN extensión:
Dim wb1 As Workbook
Set wb1 = Workbooks("Book1") ' un libro nuevo, sin guardar
' DESPUÉS de guardarlo, DEBES incluir la extensión:
Dim wb2 As Workbook
Set wb2 = Workbooks("Sales.xlsx") ' "Sales" solo -> error 9
' Lo más seguro: no lo busques por nombre — guarda la referencia
End Sub
El juicio: buscar un libro por su nombre de cadena es frágil por diseño — se rompe al renombrar, al guardar, con un error de tipeo. Si abriste o creaste el archivo en la misma macro, ya tienes la referencia. Úsala. Reserva la búsqueda por nombre para el caso raro en que otro proceso abrió el archivo.
Cuándo ActiveWorkbook sí es correcto
ActiveWorkbook no está prohibido, solo es estrecho. Es la herramienta correcta
cuando tu macro es una utilidad que actúa sobre lo que el usuario está mirando —
una herramienta del libro de macros personal, un botón de complemento que da formato
a «este archivo». En ese único escenario, «activo» es exactamente lo que quieres
decir. En la automatización de producción que abre, procesa y guarda archivos
concretos, una referencia a ActiveWorkbook es casi siempre un error latente.
Cómo ayuda ExcelMaster
Mucho VBA de malabares con libros existe por una razón: alguien necesitaba sacar
datos de un archivo y meterlos en otro de forma periódica. ExcelMaster hace eso
en lenguaje natural — dices «combina estos tres archivos de ventas en la pestaña de
resumen» y construye la unión, sin la contabilidad de Workbooks.Open /
ActiveWorkbook que se puede equivocar.
Seguirás escribiendo VBA cuando necesites una macro permanente dentro de un libro, pero para uniones entre archivos y consolidaciones puntuales, describir la tarea le gana a gestionar referencias de libros a mano.
Preguntas frecuentes
¿Cuál es la diferencia entre ThisWorkbook y ActiveWorkbook?
ThisWorkbook siempre se refiere al libro que contiene el código en ejecución: no
cambia nunca. ActiveWorkbook se refiere al libro que esté al frente en ese
momento, que cambia cada vez que el usuario cambia de ventana o tu código abre otro
archivo. Usa ThisWorkbook (o una referencia Set wb = ...) para fiabilidad.
¿Por qué obtengo «subíndice fuera del intervalo» en Workbooks("...")?
El nombre que pasaste no es un libro abierto con esa clave exacta. Si el archivo se
guardó, debes incluir la extensión — Workbooks("Sales.xlsx"), no
Workbooks("Sales"). Mejor aún: guarda la referencia desde que abriste el archivo
en lugar de buscarlo por nombre.
¿Cómo referencio un libro que acabo de abrir?
Captúralo en la misma línea: Set wb = Workbooks.Open("C:\ruta\archivo.xlsx").
Workbooks.Open devuelve el objeto del libro, así que nunca tienes que adivinar cuál
está «activo» después.
¿ExcelMaster reemplaza a VBA para combinar archivos?
Para uniones puntuales y programadas entre archivos, sí — describes la consolidación en lenguaje natural y ExcelMaster la construye sin contabilidad de libros. Para macros permanentes incrustadas en un libro, VBA sigue encajando.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — verificado por última vez el 13/06/2026.
Guías relacionadas: VBA Worksheet · VBA ActiveSheet · VBA Range · VBA Copy Paste · VBA For Loop
