TL;DR —
ThisWorkbooksiempre se refiere al único libro que contiene el código en ejecución, sin importar en qué ventana haga clic el usuario.ActiveWorkbookse refiere a lo que esté al frente ahora mismo, y eso puede cambiar bajo tus pies. UnRange("A1")a secas es aún peor: no nombra ni un libro ni una hoja, así que cae en la que esté activa en ese instante. Ancla las escrituras aThisWorkbook(o a una variable de libro que tú mismo declares conSet) y la macro deja de depender de dónde hizo clic el ratón por última vez.
Sub WhereDoesItLand()
' ThisWorkbook = el archivo donde vive este codigo - fijo para siempre
ThisWorkbook.Worksheets("Summary").Range("A1").Value = "Report"
' ActiveWorkbook = lo que este al frente cuando corre esta linea - voluble
Debug.Print ThisWorkbook.Name ' p. ej. Macros.xlsm - siempre
Debug.Print ActiveWorkbook.Name ' lo que el usuario haya clicado al final
End Sub
Lo que aprenderás
- El modelo mental —
ThisWorkbookes una dirección fija;ActiveWorkbook, una que se mueve - Las tres herramientas para decir a qué objeto te refieres, y por qué una referencia sin calificar es peligrosa
ThisWorkbookfrente aActiveWorkbook, la distinción más importante de todo el VBA fiable- La trampa silenciosa — por qué una macro que funciona en tu equipo corrompe el archivo abierto de un compañero
- Cómo referenciar otro libro abierto por su nombre, y cómo abrir uno y conservar su referencia
- La opinión — califica cada referencia y usa
ThisWorkbookpor defecto
El modelo mental: una dirección fija, no una que se mueve
Cada referencia en VBA responde a una pregunta: qué libro, qué hoja, qué celda. ThisWorkbook responde
a la primera y no cambia nunca su respuesta. Es el libro que contiene el código que estás ejecutando — el
archivo donde viven tus módulos y tus macros. Abre otros diez libros, haz clic por todos ellos, y
ThisWorkbook seguirá apuntando al mismo archivo que señalaba cuando la macro arrancó.
ActiveWorkbook responde a la misma pregunta con lo que sea que esté al frente en este instante. Es un
blanco móvil por diseño: en cuanto el usuario hace clic en otra ventana, o tu propio código abre un archivo
nuevo, el libro activo cambia. Ambos son útiles — pero no son intercambiables, y tratar uno como el otro es la
raíz de toda una familia de errores del tipo «mi macro editó el archivo equivocado».
Tres formas de decir a qué objeto te refieres
ThisWorkbook es una de las tres herramientas que VBA te da para nombrar el objeto que quieres en lugar
de dejar que el código adivine. Determinan si tu macro es fiable o frágil, y son la columna vertebral de este
breve grupo de guías.
| Herramienta | A qué apunta | Cuándo recurrir a ella |
|---|---|---|
ThisWorkbook |
El libro que contiene este código — fijo | Leer ajustes o escribir resultados que pertenecen a la macro |
| ActiveWorkbook / ActiveSheet | Lo que esté al frente ahora mismo — voluble | Una herramienta genérica que actúa sobre «lo que el usuario tenga abierto» |
| Worksheets(...) | Una hoja con nombre dentro de un libro — la colección | Dirigirte a una pestaña concreta por nombre, índice o CodeName |
La regla que las une: una referencia sin calificar recurre a lo que esté activo. Escribe
Range("A1") = 1 sin un libro ni una hoja delante, y VBA rellena los huecos con el libro activo y la hoja
activa de ese momento. Eso es cómodo en la ventana Inmediato y catastrófico en una macro guardada.
ThisWorkbook frente a ActiveWorkbook: lo fijo frente a lo voluble
Esta es la distinción que grabar a fuego en la memoria. Imagina que tu macro vive en Macros.xlsm, y que el
usuario también ha abierto Sales.xlsx y lo está mirando cuando pulsa tu botón.
Sub FixedVsFickle()
ThisWorkbook.Worksheets(1).Range("A1").Value = "written by the macro"
' ^ siempre cae en Macros.xlsm, el archivo donde vive este codigo
ActiveWorkbook.Worksheets(1).Range("A1").Value = "written by the macro"
' ^ cae en Sales.xlsx - porque es lo que el usuario estaba mirando
End Sub
Código de aspecto idéntico, dos archivos distintos. ThisWorkbook es la elección honesta cuando el objetivo
es «el archivo al que pertenece mi macro» — una hoja de ajustes, un registro, una pestaña de resultados que
viaja con la herramienta. ActiveWorkbook solo es correcto cuando de verdad quieres decir «lo que sea que el
usuario haya traído al frente». Si alguna vez dudas cuál querías, querías ThisWorkbook: es el que no puede
sorprenderte.
Un pariente que conviene conocer: ThisWorkbook no siempre es el activo, y no siempre es el que se abrió
primero. Es, sencillamente, el que tiene el código. Cuando una macro en Macros.xlsm abre Report.xlsx, el
archivo nuevo pasa a ser ActiveWorkbook, pero ThisWorkbook no se inmuta.
La trampa silenciosa: funciona en tu equipo y se rompe en el suyo
Así es como el bug llega de verdad a producción. Escribes y pruebas la macro con un solo libro abierto — el
tuyo. Con un único libro, el libro activo es tu libro, así que un Range("A1") sin calificar y uno
calificado con ThisWorkbook se comportan igual. Todas las pruebas pasan.
Luego un compañero la ejecuta con tres libros abiertos. Ahora «activo» es lo que él estuviera mirando, las
escrituras sin calificar caen en su archivo, y tu macro sobrescribe en silencio una celda de un informe que
nunca debió tocar. No salta ningún error — el código hizo exactamente lo que decía, que era «escribe en lo
que esté activo». El arreglo no es un controlador On Error; es dejar de omitir el nombre del libro.
' FRAGIL - depende de lo que el usuario haya clicado al final
Range("A1").Value = total
' FIABLE - nombra el libro y la hoja, siempre
ThisWorkbook.Worksheets("Summary").Range("A1").Value = total
Califica la referencia y la macro se comporta igual en cualquier equipo, con cualquier cantidad de archivos
abiertos. Por eso el hábito más valioso del VBA a nivel de libro es este: nunca dejes que una llamada a
Range o a Cells flote sin un libro y una hoja delante.
Referenciar otro libro abierto por su nombre
A veces necesitas de verdad un libro distinto — un archivo de datos que el usuario abrió, o uno que abres tú
mismo. No pases por ActiveWorkbook y confíes en la suerte. Nómbralo, o conserva una referencia a él.
Sub TalkToAnotherFile()
Dim src As Workbook
' Ya esta abierto? Tomalo por su nombre de archivo (con extension)
Set src = Workbooks("Sales.xlsx")
' Aun no esta abierto? Abrelo y conserva la referencia que Open devuelve
Set src = Workbooks.Open("C:\Data\Sales.xlsx")
' Ahora cada referencia es explicita - sin adivinar que archivo
Debug.Print src.Worksheets("Jan").Range("A1").Value
ThisWorkbook.Worksheets("Summary").Range("A1").Value = _
src.Worksheets("Jan").Range("A1").Value
End Sub
Dos reglas lo vuelven seguro. Primera, Workbooks("Sales.xlsx") necesita el nombre del archivo con su
extensión, y el archivo debe estar ya abierto o lanza Subscript out of range. Segunda, Workbooks.Open
devuelve el libro que abrió — captúralo en una variable con Set en la misma línea, para que nunca tengas
que preguntar «cuál está activo ahora». Una variable de libro que tú declaras con Set es aún mejor que
ThisWorkbook: es fija y explícita sobre a qué archivo te refieres.
La opinión: califica todo, usa ThisWorkbook por defecto
Cada referencia de una macro debería nombrar su libro y su hoja, y el libro por defecto debería ser
ThisWorkbook. Las referencias sin calificar no son código más corto que merezca la pena — son una apuesta a
que el archivo correcto estará activo en el instante exacto en que corre la línea, y esa apuesta se pierde el
día en que otra persona ejecuta tu macro con más de un archivo abierto.
La disciplina es pequeña y rinde para siempre: recurre a ThisWorkbook cuando el objetivo pertenece a tu
herramienta, declara con Set una variable Workbook cuando te refieres a otro archivo concreto, y reserva
ActiveWorkbook para el caso raro en que «lo que el usuario tenga delante» sea de verdad el objetivo
correcto. Trata un Range a secas, sin un libro delante, como una línea sin terminar, exactamente igual que
tratarías una variable sin declarar.
Cuando el trabajo real es mayor que elegir el libro correcto
Acertar con la referencia es lo mínimo; el trabajo de verdad suele ser la lógica que va encima — concilia estos dos archivos, saca las filas del mes pasado, totaliza por región en el resumen. Escribir eso a mano significa acertar con la referencia del libro y con el bucle y con los casos límite, cada vez. ExcelMaster te deja describir el resultado en lenguaje natural — «compara Sales.xlsx con la pestaña de resumen de este archivo y marca las filas que no coincidan» — y escribe y ejecuta el código, respaldando tu libro primero y calificando cada referencia por ti. Tú dices a qué archivos te refieres; él se encarga de la fontanería de la que trata este artículo.
Preguntas frecuentes
¿Cuál es la diferencia entre ThisWorkbook y ActiveWorkbook en VBA?
ThisWorkbook siempre se refiere al libro que contiene el código en ejecución y no cambia nunca.
ActiveWorkbook se refiere al libro que esté al frente en el momento en que corre la línea, que cambia cada
vez que el usuario hace clic en otra ventana o tu código abre un archivo nuevo. Usa ThisWorkbook cuando te
refieres al archivo propio de la macro, y ActiveWorkbook solo cuando de verdad quieres decir «lo que sea que
el usuario tenga delante».
¿ThisWorkbook es siempre el libro activo?
No. ThisWorkbook es el archivo que contiene el código; el libro activo es lo que esté al frente. Coinciden
solo cuando el archivo propio de tu macro resulta ser el que está delante. En cuanto otro libro está activo —
el usuario hizo clic en él, o tu macro lo abrió — los dos apuntan a archivos distintos.
¿Cómo referencio otro libro en VBA?
Si ya está abierto, usa Workbooks("Name.xlsx") con el nombre del archivo y su extensión. Si no está abierto,
usa Set wb = Workbooks.Open("C:\ruta\Name.xlsx"), que devuelve el libro para que puedas conservar su
referencia. Luego califica cada referencia a través de esa variable en lugar de fiarte del libro activo.
¿Por qué mi macro escribe en el libro equivocado?
Casi siempre porque una llamada a Range o Cells no tiene un libro delante, así que cae en lo que esté
activo cuando corre la línea. Funciona mientras pruebas con un solo archivo abierto, y luego escribe en el
archivo de un compañero cuando hay varios abiertos. Califica la referencia con ThisWorkbook o con una
variable de libro y caerá en el archivo correcto siempre.
¿ThisWorkbook funciona en un complemento?
Sí, y ahí es justo donde se gana el sueldo. En un complemento, ThisWorkbook se refiere al propio archivo del
complemento, mientras que los datos del usuario están en algún otro libro. Usa ThisWorkbook para los
recursos propios del complemento y una variable de libro con Set (o ActiveWorkbook, a propósito) para los
datos del usuario.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 07/09/2026.
Guías relacionadas: VBA ActiveWorkbook · VBA Worksheets · VBA Workbook · VBA Range · VBA Dim
