ActiveSheet es la forma que tiene VBA de referirse a la hoja que está visible en cada momento dentro del libro de Excel abierto: la pestaña que tienes delante en pantalla. Cuando escribes una macro y no nombras ninguna hoja, VBA actúa sobre esa hoja activa. En este tutorial la vas a usar sobre un libro real, "Tienda", que tiene una hoja Ventas con productos, precios y cantidades, y la irás ampliando paso a paso hasta dominar ActiveSheet.
Funciona en Excel para Microsoft 365, 2024, 2021, 2019, 2016, 2013 y 2010 de escritorio, y también en Excel para Mac. En Excel para la web no está disponible: allí se automatiza con Office Scripts.
Qué es la ActiveSheet y por qué tu macro trabaja sobre ella
Imagina tu libro "Tienda" con tres hojas: Ventas, Resumen y Productos. Estás revisando los datos de Resumen y ejecutas una macro para copiar el total del día a la última fila de Ventas. Si la macro no nombra ninguna hoja, ¿en cuál escribe? En la que tienes abierta en ese momento: la hoja activa.
ActiveSheet es un objeto de VBA (en inglés, ActiveSheet) que apunta a esa hoja visible. Cada vez que haces clic en una pestaña, cambias la hoja activa. Cuando abres el libro, la hoja activa es la que estaba seleccionada al guardar. Cuando VBA ejecuta una instrucción sin decir a qué hoja afecta, usa ActiveSheet por ti.
En la práctica esto significa que tu macro escribe en la pestaña que el usuario ve, y eso puede ser un problema si la persona cambia de pestaña mientras la macro se ejecuta. La solución más robusta es asignar la hoja a una variable con Set sht = ActiveSheet antes de hacer nada, y trabajar siempre sobre esa variable.
MsgBox ActiveSheet.Name para confirmar en qué hoja vas a trabajar.El editor de VBA y la primera macro con ActiveSheet
La macro más corta posible es aquella que escribe un texto en la celda A1 de la hoja activa. Como no nombras ninguna hoja, VBA interpreta Range("A1") como la celda A1 de ActiveSheet.
- Abre el libro
Tienda.xlsxy, si no ves la pestaña Programador, actívala. - Pulsa Alt+F11 para abrir el editor de Visual Basic.
- En el menú, ve a Insertar > Módulo. Se abre una ventana en blanco a la derecha.
- Escribe este código:
Sub Saludo()
Range("A1").Value = "Hola"
MsgBox "Listo"
End Sub
- Pulsa F5 (o Ejecutar > Ejecutar Sub/UserForm) para lanzar la macro. Verás un mensaje "Listo" y, al volver a Excel, la celda A1 de la hoja que tengas activa contendrá la palabra "Hola".
Productos, ejecuta la macro y verás que "Hola" aparece en la A1 de Productos. Ahora ve a Ventas, ejecútala de nuevo y comprobarás que la A1 de Ventas es la que cambia. La macro siempre escribe en la hoja que está activa.Activar la pestaña Programador si no la ves
La pestaña Programador viene oculta por defecto. Sigue estos pasos para mostrarla:
Al aceptar, la pestaña Programador aparece en la cinta. Allí encontrarás Grabar macro y el botón para abrir el editor de VBA (Alt+F11 también funciona siempre).
Activar una hoja concreta con Worksheets.Activate
Cuando quieras cambiar la pestaña activa desde VBA, usas el método .Activate del objeto Worksheets. La sintaxis es Worksheets("Nombre").Activate. Es el equivalente programático de hacer clic en la pestaña.
Sub IrAResumen()
Worksheets("Resumen").Activate
End Sub
La pestaña Resumen queda delante y se vuelve la hoja activa.
Después de ejecutar este código, cualquier Range("A1") que escribas a continuación sin nombrar hoja caerá en Resumen. Por eso conviene guardar la hoja activa en una variable antes de saltar a otra, como ves en el siguiente apartado.
Asignar la hoja activa a una variable antes de cambiar de hoja
Si activas otra hoja con .Activate, VBA olvida cuál era la anterior. Para no perder esa referencia, guárdala en una variable de tipo Worksheet:
Sub CopiarVentasAResumen()
Dim shtOrigen As Worksheet
Set shtOrigen = ActiveSheet
Worksheets("Resumen").Activate
Range("A1").Value = shtOrigen.Range("B2").Value
End Sub
Primero capturas la hoja activa en shtOrigen, luego cambias a Resumen y, desde Resumen, lees el valor de B2 de la hoja origen. Si solo hubieras escrito Range("B2").Value después del .Activate, leerías la B2 de Resumen, que es justo el error que quieres evitar.
Leer y escribir en la hoja activa con Range y Cells
Tu hoja Ventas contiene productos, precios y cantidades. Vas a añadir el importe total de cada fila (precio por cantidad) en la columna D.
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Producto | Precio | Cantidad | Total |
| 2 | Lápiz | 1,50 | 10 | |
| 3 | Cuaderno | 3,20 | 5 | |
| 4 | Goma | 0,80 | 12 |
La macro recorre las filas con un bucle For y, con Cells(i, columna), escribe el producto en la columna D. Cells admite números: Cells(2, 4) equivale a Range("D2").
Sub CalcularTotal()
Dim i As Long
For i = 2 To 4
Cells(i, 4).Value = Cells(i, 2).Value * Cells(i, 3).Value
Next i
End Sub
Tras ejecutarla, D2 vale 15,00; D3 vale 16,00; D4 vale 9,60. Como no nombras ninguna hoja, Cells apunta a la hoja activa.
Productos, ejecuta la macro y verás los totales aparecen en Productos, no en Ventas. Para evitarlo, o bien te aseguras de estar en Ventas, o bien nombras la hoja al principio: Worksheets("Ventas").Cells(i, 4).Value = ....Cambiar entre hojas y copiar datos entre ActiveSheet y Worksheets
Ahora tu libro tiene tres hojas: Datos, Resumen y Ventas. La macro debe activarse en Datos, copiar el bloque A1:A5 y pegarlo en G1 de la hoja activa.
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Origen | Valor | |||||
| 2 | Caja | 120 | |||||
| 3 | Mostrador | 85 | |||||
| 4 | Online | 230 | |||||
| 5 | Tienda física | 175 |
| A | |
|---|---|
| 1 | Cliente |
| 2 | Ana |
| 3 | Luis |
| 4 | Marta |
| 5 | Pedro |
| 6 | Sara |
La macro es la siguiente. Fíjate en cómo se copia desde Datos (con Worksheets("Datos")) y se pega en ActiveSheet (la hoja que esté visible en ese momento):
Sub CopiarDatosAResumen()
Worksheets("Datos").Activate
Range("A1:A5").Copy
ActiveSheet.Range("G1").PasteSpecial xlPasteValues
End Sub
Si en lugar de ActiveSheet pusieras Worksheets("Resumen"), la macro siempre pegaría en Resumen, aunque el usuario hubiera cambiado de pestaña. Con ActiveSheet, el destino cambia según la pestaña que esté activa al ejecutar.
Sheets.Add crea una hoja y la deja como activa
Añadir una hoja nueva desde VBA es directo con Sheets.Add. La hoja recién creada queda automáticamente como ActiveSheet.
Sub CrearTemporal()
Dim hoja As Worksheet
Set hoja = Worksheets.Add(After:=Worksheets(Worksheets.Count))
hoja.Name = "Temporal"
hoja.Range("A1").Value = "Borrame"
End Sub
Aparece una pestaña "Temporal" al final del libro, ya seleccionada, con "Borrame" en A1.
Guardar la referencia con Set hoja = ... antes de ponerle nombre evita el error en tiempo de ejecución 1004 que salta si VBA no encuentra la hoja recién creada por su nombre.
Proteger y desproteger la ActiveSheet desde VBA
Proteger la hoja activa con contraseña sirve para que nadie (incluidas tus macros) modifique las celdas por accidente. Desde VBA usas ActiveSheet.Protect y ActiveSheet.Unprotect.
Sub ProtegerActiva()
ActiveSheet.Protect Password:="1234", UserInterfaceOnly:=True
End Sub
Sub DesprotegerActiva()
ActiveSheet.Unprotect Password:="1234"
End Sub
Permisos para todos los usuarios de esta hoja:
El argumento UserInterfaceOnly:=True permite que tus macros sigan modificando la hoja aunque el usuario no pueda editarla a mano. Para comprobar que la protección funciona, ve a Revisar > Cambios > Desproteger hoja y escribe 1234.
UserInterfaceOnly se reinicia al cerrar y abrir el libro. Si tu macro depende de él, protégelo de nuevo al arrancar.Por qué una macro actúa sobre la hoja equivocada
El error más habitual es este: el lector está mirando Resumen, ejecuta una macro que debería escribir en Ventas, y los resultados los ve en Resumen. La causa casi siempre es la misma: la macro usa Range o Cells sin haber activado la hoja destino, o usa ActiveSheet cuando debería usar Worksheets("Ventas").
Una variante típica es el orden invertido:
Sub OrdenIncorrecto()
Range("A1").Value = "Antes"
Worksheets("Ventas").Activate
Range("A1").Value = "Después"
End Sub
La primera línea escribe "Antes" en la hoja activa en ese momento (por ejemplo Resumen). La segunda activa Ventas y escribe "Después" allí. Si lo que querías era escribir las dos cosas en Ventas, el arreglo es activar primero:
Sub OrdenCorrecto()
Worksheets("Ventas").Activate
Range("A1").Value = "Antes"
Range("A1").Value = "Después"
End Sub
Otra causa frecuente es confiar en que el libro abre con Ventas seleccionada. Si el usuario guardó con Resumen activa, ActiveSheet al abrir será Resumen. La solución robusta es no depender de la hoja activa y nombrar siempre la hoja destino.
ActiveSheet contra ThisWorkbook y ActiveWorkbook
Estos tres objetos se confunden a menudo porque los tres contienen la palabra "active". La diferencia es importante:
| Objeto | Qué devuelve | Con dos libros abiertos |
|---|---|---|
ActiveSheet |
La hoja activa de la ventana con foco | La hoja visible en la ventana donde estás mirando |
ActiveWorkbook |
El libro abierto con foco | El libro que ves en la barra de título |
ThisWorkbook |
El libro que contiene la macro | Siempre el mismo, da igual dónde mires |
Si tu macro vive en Tienda.xlsm y el usuario tiene además Precios.xlsx abierto, ActiveWorkbook puede ser uno u otro según en cuál haga clic, pero ThisWorkbook siempre será Tienda.xlsm. Por eso, cuando quieras guardar datos en el mismo archivo que tiene la macro, usa ThisWorkbook.Worksheets(...) en lugar de ActiveWorkbook.Worksheets(...).
Lo que la ActiveSheet no puede hacer (y cómo sustituirlo)
ActiveSheet tiene tres límites importantes que conviene conocer antes de abusar de ella.
No fuerza el foco si la ventana está oculta. Si el libro está oculto (Windows(1).Visible = False), ActiveSheet sigue devolviendo la hoja que estaba activa antes de ocultar la ventana. La macro funciona, pero el usuario no ve el resultado. Alternativa: usa Worksheets("Ventas") directamente, sin .Activate.
No sirve para recorrer todas las hojas. Si quieres escribir el mismo dato en cada hoja del libro, no las actives una a una. Usa un bucle For Each:
Sub EscribirEnTodas()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Range("Z1").Value = "Revisado"
Next ws
End Sub
No existe en Excel para la web. VBA necesita el escritorio. Si tu equipo trabaja con Excel para la web, la automatización se hace con Office Scripts, que tiene su propio modelo de objetos y donde el equivalente de ActiveSheet es workbook.getActiveWorksheet().
.Formula y .FormulaR1C1 esperan los nombres de función en inglés y comas, mientras que .FormulaLocal y .FormulaR1C1Local usan el idioma del usuario. Más detalles en la documentación oficial.Lo que ya sabes hacer con ActiveSheet y el siguiente paso
- Leer y escribir en la pestaña activa con
RangeyCellssin nombrarla. - Asignar la hoja activa a una variable para no perderla al saltar de pestaña.
- Cambiar entre hojas con
Worksheets("X").Activatey saber que VBA olvida la hoja anterior. - Crear hojas nuevas con
Sheets.Addy entender que quedan activas automáticamente. - Proteger y desproteger la hoja activa con contraseña, y distinguir
ActiveSheetdeThisWorkbookyActiveWorkbook.
El siguiente paso natural es acelerar tus macros. Cuando recorres muchas filas con Cells dentro de un bucle, Excel redibuja la pantalla en cada escritura y eso ralentiza todo. Añade al principio de cada macro Application.ScreenUpdating = False, y al final Application.ScreenUpdating = True. Enseguida notarás la diferencia en libros grandes.
Dudas al usar ActiveSheet en VBA
1. Cómo activar una hoja con VBA
En VBA, la propiedad ActiveSheet devuelve la hoja que está activa en el momento. Para activarla basta con usar Worksheets("Hoja1").Activate. Si la hoja está oculta, primero se muestra con Worksheets("Hoja1").Visible = xlSheetVisible y luego se activa.
2. Cómo cambiar la hoja activa al imprimir en Excel
En la pestaña Diseño de página elige el menú desplegable del grupo Configurar página y abre Configurar páginas. En la pestaña Hoja selecciona Hojas activas dentro de la opción Imprimir y pulsa Aceptar. Así solo se imprime la hoja que tienes seleccionada en ese momento.
3. Para qué sirve el evento Worksheet_Activate en VBA
El evento Worksheet_Activate se ejecuta automáticamente cada vez que una hoja pasa a ser la hoja activa. Se coloca en el módulo de código de esa hoja (clic derecho sobre la pestaña > Ver código) y sirve para lanzar tareas al entrar en ella, como refrescar datos o proteger celdas.
4. Cómo seleccionar la hoja activa en Excel
Haz clic directamente sobre la pestaña de la hoja en la parte inferior del libro para convertirla en la hoja activa. También puedes usar el teclado con Ctrl+Re Pág para moverte a la hoja siguiente o con Ctrl+Av Pág para ir a la anterior, y la hoja elegida quedará activa.
5. Cómo activar una hoja en VBA usando una variable con su nombre
Guarda el nombre en una variable de texto, por ejemplo miHoja = "Datos", y luego ejecuta Worksheets(miHoja).Activate. Conviene añadir On Error Resume Next o una comprobación con If Worksheets.Count > i para evitar el error 9 cuando el nombre no exista.
6. Atajo de teclado para activar una hoja en Excel
No hay un atajo directo para activar una hoja concreta, pero puedes llegar a ella con Ctrl+Av Pág (hoja siguiente) y Ctrl+Re Pág (hoja anterior). Para más rapidez, clic derecho sobre las flechas de navegación de la parte inferior abre la lista de hojas y te lleva a cualquiera con un clic.
7. Activate method of Worksheet class failed
Este error aparece cuando intentas activar una hoja oculta o que no existe en el libro. La solución es desproteger el libro si está protegido, mostrar primero la hoja con Worksheets("Hoja1").Visible = xlSheetVisible y después ejecutar el método Activate.
Fuentes
- MicrosoftSheets.Add method (Excel) | Microsoft Learnconsultado el 13/10/2026
- MicrosoftHOJA — documentación oficialconsultado el 13/10/2026
- MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 13/10/2026
- MicrosoftLAMBDA — documentación oficialconsultado el 13/10/2026
- MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 13/10/2026