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

VBA ThisWorkbook en Excel — por qué no es lo mismo que ActiveWorkbook

|

VBA ThisWorkbook en Excel — por qué no es lo mismo que ActiveWorkbook

TL;DRThisWorkbook siempre se refiere al único libro que contiene el código en ejecución, sin importar en qué ventana haga clic el usuario. ActiveWorkbook se refiere a lo que esté al frente ahora mismo, y eso puede cambiar bajo tus pies. Un Range("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 a ThisWorkbook (o a una variable de libro que tú mismo declares con Set) 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 — ThisWorkbook es 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
  • ThisWorkbook frente a ActiveWorkbook, 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 ThisWorkbook por 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