Resumen (TL;DR) —
ActiveSheet,ActiveCellySelectionson estado global mutable: apuntan a «lo que esté seleccionado ahora mismo», y eso cambia en cuanto el usuario hace clic, tu macro hace.Activatede algo o incluso al refrescarse la pantalla. La verdadera trampa está oculta: unRange("A1")oCells(1,1)sin calificar significa en silencioActiveSheet.Range("A1"), así que la misma línea de código escribe en una hoja distinta según lo que esté al frente. La solución es un hábito: califica cada Range con una hoja explícita,ws.Range("A1"), y nunca montes automatización sobre «activo».
Esta es la clave de bóveda del modelo de objetos. Workbook → Worksheet → Range es la
jerarquía; ActiveSheet es el atajo que salta en silencio el medio y deja que Excel
elija la hoja por ti. A veces eso es lo que quieres. En automatización, es la fuente
más común de errores de «mi macro funcionaba ayer».
Qué aprenderás
- Por qué
ActiveSheet/ActiveCell/Selectionson estado mutable que no controlas - La trampa del Range sin calificar que escribe en la hoja equivocada
- Por qué toda macro grabada depende de «activo» — y se rompe al reutilizarla
- El uso estrecho y legítimo de
ActiveSheet
El modelo mental: «activo» es una variable, no un lugar
Los principiantes leen ActiveSheet como «mi hoja». No lo es. Es «la hoja que da la
casualidad de estar encima en este milisegundo»: una variable global que Excel
reasigna constantemente, a menudo sin que se lo pidas. Montar una macro sobre
ActiveSheet es como dar indicaciones que empiezan con «desde donde estés parado»:
bien si están donde crees, un desastre si se movieron.
Sub ActiveIsMutable()
Debug.Print ActiveSheet.Name ' "Summary" — ahora mismo
Worksheets("Data").Activate ' acabas de mover «activo»
Debug.Print ActiveSheet.Name ' "Data" — misma variable, nuevo valor
' Todo lo que corrió entre esas dos líneas asumiendo ActiveSheet =
' "Summary" ahora opera sobre "Data" en su lugar.
End Sub
Por qué importa: ActiveSheet no es una propiedad de tu código — es estado
compartido que pertenece a Excel e influenciado por el usuario. En cuanto dos partes
de una macro no concuerdan sobre qué está activo, tienes un error que solo aparece «a
veces».
La trampa que más daño hace: el Range sin calificar
Esta es la línea que muerde a todos. Cuando escribes Range("A1") sin una hoja
delante, VBA rellena en silencio ActiveSheet. El código parece apuntar a una
celda concreta. En realidad apunta a una celda de la hoja que esté activa.
Sub TheUnqualifiedTrap()
' Esto PARECE escribir en un lugar fijo...
Range("A1").Value = "Total" ' = ActiveSheet.Range("A1") <-- ¡oculto!
Cells(1, 1).Value = 100 ' = ActiveSheet.Cells(1, 1) <-- ¡oculto!
' ...pero si la hoja activa no es la que supusiste, escribe en la
' pestaña equivocada — y Excel no reporta error alguno.
End Sub
La solución no es «acuérdate de activar primero la hoja correcta». La solución es nunca dejar la hoja implícita:
Sub AlwaysQualify()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Summary")
ws.Range("A1").Value = "Total" ' explícito — no puede caer en otro lado
ws.Cells(1, 1).Value = 100 ' explícito — sin ActiveSheet a la vista
End Sub
Cada Range, cada Cells, cada Rows/Columns debería colgar de un ws. explícito.
El juicio: un Range sin calificar en código de producción es un error esperando a
que se active la hoja equivocada — trátalo como tratarías una variable sin
inicializar.
Por qué las macros grabadas dependen de «activo» — y se rompen
La grabadora de macros solo puede anotar lo que haces: clic en una hoja, clic en
una celda, teclear. Así que produce Sheets("Data").Select y luego
Selection.Value = ... — código puro de ActiveSheet/Selection. Por eso una macro
grabada funciona el día que la grabas (la hoja correcta está activa) y se rompe a la
semana siguiente (otra hoja está al frente). Capturó tus clics, no tu intención.
' Salida de la grabadora — cada línea se apoya en «activo»
Sheets("Data").Select
Range("B2").Select
ActiveCell.Value = "Done"
' Reescrito — intención, no clics; sobrevive a cualquier hoja activa
ThisWorkbook.Worksheets("Data").Range("B2").Value = "Done"
Reescribir las macros grabadas para quitar Select/Activate/Selection/ActiveSheet
es la limpieza de mayor impacto que puedes hacer: más rápida (sin redibujados) y
correcta. Las referencias de hoja con que reemplazarlas están en
VBA Worksheet, y la misma idea aplicada a copiar en
VBA Copy Paste.
Cuándo ActiveSheet sí es lo correcto
ActiveSheet tiene exactamente un trabajo honesto: cuando tu macro es una
herramienta que actúa sobre lo que el usuario está mirando. Un botón que da
formato a «la hoja en la que estoy», una utilidad rápida en tu libro de macros
personal — ahí «activo» es precisamente la intención y leer ActiveSheet es
correcto. La prueba: si un humano debe estar mirando la hoja correcta para que la
macro tenga sentido, ActiveSheet es válido. Si la macro debe correr desatendida
sobre hojas concretas, no.
Cómo ayuda ExcelMaster
Todo el campo minado de ActiveSheet existe porque VBA hace implícito el «dónde».
ExcelMaster lo hace explícito por defecto — nombras la hoja y el rango en
lenguaje natural («limpia la pestaña Summary y reconstruye los totales»), y no hay
contexto «activo» oculto que equivocar. La clase de error de hoja equivocada
simplemente no puede ocurrir.
Cuando sí necesites una macro incrustada y permanente, VBA sigue siendo la
herramienta — solo califica cada Range y mantén ActiveSheet fuera.
Preguntas frecuentes
¿Cuál es la diferencia entre ActiveSheet y una referencia Worksheet?
ActiveSheet es la hoja que esté encima en ese momento — cambia cuando el usuario o
el código cambian de hoja. Una referencia como ThisWorkbook.Worksheets("Data")
siempre apunta a la misma hoja concreta. La automatización debe usar referencias
explícitas; ActiveSheet es para herramientas que actúan sobre la hoja actual del
usuario.
¿Por qué mi macro escribe en la hoja equivocada?
Casi seguro usaste un Range(...) o Cells(...) sin calificar, que por defecto es
ActiveSheet. Si una hoja distinta a la supuesta estaba activa, la escritura cae
ahí, sin error. Califica cada Range — ws.Range(...) — para que el destino no pueda
desviarse.
¿Es malo usar Select y Activate en VBA?
Para automatización, sí. Son lentos, parpadean la pantalla y hacen que tu código
dependa de ActiveSheet/Selection, lo que causa errores de hoja equivocada. Habla
con los objetos directamente (ws.Range("A1").Value = 1). La excepción es la rara
macro de utilidad que busca actuar sobre la selección actual del usuario.
¿Cómo obtengo la hoja en la que está el usuario ahora?
Ese es el único buen uso de ActiveSheet: Set ws = ActiveSheet lo captura una vez,
y desde entonces trabajas a través de ws — así, aunque «activo» cambie después, tu
referencia no.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — verificado por última vez el 13/06/2026.
Guías relacionadas: VBA Workbook · VBA Worksheet · VBA Range · VBA Copy Paste · VBA For Loop
