TL;DR —
Worksheetses una colección, y direccionas una hoja dentro de ella de tres maneras: por nombre (Worksheets("Jan")), por índice (Worksheets(1)) o por CodeName (Sheet1). El nombre se rompe en cuanto un usuario renombra la pestaña; el índice se rompe en cuanto alguien arrastra las pestañas a un orden nuevo; el CodeName no se rompe con ninguno, porque solo tú puedes cambiarlo. Califica la colección con un libro, asigna la hoja a una variable una sola vez conSet, y prefiere el CodeName para las pestañas que tú controlas.
Sub ThreeWaysToNameASheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Jan") ' por nombre - se rompe si renombran la pestana
Set ws = ThisWorkbook.Worksheets(1) ' por indice - se rompe si reordenan las pestanas
Set ws = Sheet1 ' por CodeName - sobrevive a ambos
ws.Range("A1").Value = "Report"
End Sub
Lo que aprenderás
- El modelo mental —
Worksheetses una colección que puedes direccionar de tres maneras distintas - Las tres herramientas de referencia, y dónde se sitúa la colección
Worksheetsentre ellas Worksheetsfrente aSheets, y la diferencia de las hojas de gráfico que sí importa- Las tres formas de nombrar una hoja, y exactamente qué rompe a cada una
- La trampa silenciosa — por qué una macro que funciona muere el día que un usuario renombra una pestaña
- La opinión — asigna una vez, calificada, y prefiere el CodeName
El modelo mental: una colección, direccionada de tres maneras
Worksheets no es un solo objeto — es la colección de todas las hojas de cálculo de un libro. Para
hacerle algo a una hoja, la sacas de la colección por un identificador. VBA te da tres identificadores, y no
son igual de robustos:
- Por nombre —
Worksheets("Jan")— el texto de la pestaña. Legible, y el más común. También el más frágil, porque el nombre de la pestaña es lo único que tus usuarios cambian con total libertad. - Por índice —
Worksheets(1)— la posición, de izquierda a derecha. Práctico para «la primera hoja», inútil en cuanto alguien arrastra las pestañas. - Por CodeName —
Sheet1— un nombre interno que solo un desarrollador puede cambiar, en la ventana Propiedades. Invisible para los usuarios, así que sobrevive a cualquier cosa que le hagan a las pestañas.
Elegir qué identificador usar es elegir cómo de frágil será tu macro. Esa es toda la lección.
La colección Worksheets entre las tres herramientas de referencia
Nombrar la hoja es solo la mitad de una referencia — también tienes que decir en qué libro vive. Ahí es donde entran las otras dos herramientas de este grupo de guías.
| Herramienta | A qué apunta | Combínala con |
|---|---|---|
| ThisWorkbook | El libro que contiene este código — fijo | .Worksheets("Jan") para llegar a una pestaña concreta de tu propio archivo |
| ActiveWorkbook / ActiveSheet | Lo que esté al frente ahora mismo — voluble | Rara vez — solo para herramientas genéricas |
Worksheets(...) |
Una hoja con nombre dentro de un libro | Siempre con un libro delante — ThisWorkbook.Worksheets(...) |
La regla que une todo el grupo también aplica aquí: un Worksheets("Jan") sin calificar entra en el libro
activo. Ponle un libro delante — ThisWorkbook.Worksheets("Jan") — para que la hoja se busque en el archivo
que quieres, no en lo que el usuario haya clicado por última vez.
Worksheets frente a Sheets: la diferencia que muerde
Worksheets y Sheets parecen intercambiables y suelen comportarse así, pero no son la misma colección.
Sheets contiene todas las pestañas — hojas de cálculo y hojas de gráfico. Worksheets contiene solo
las hojas de cuadrícula en las que tecleas.
Debug.Print ThisWorkbook.Worksheets.Count ' solo hojas de cuadricula
Debug.Print ThisWorkbook.Sheets.Count ' hojas de cuadricula + hojas de grafico
La mayoría de los libros no tienen hojas de gráfico, así que los dos recuentos coinciden y nadie se da cuenta.
Añade una hoja de gráfico y los números divergen — y un bucle sobre Sheets que da por hecho que cada
elemento es una hoja de cálculo dará con la hoja de gráfico y lanzará un error en una propiedad exclusiva de
las hojas de cálculo. Usa Worksheets cuando te refieras a hojas de cuadrícula, que es casi siempre. Recurre
a Sheets solo cuando quieras a propósito las hojas de gráfico también en el bucle.
Las tres formas de nombrar una hoja, y qué rompe a cada una
Alinéalas contra las dos cosas que usuarios y desarrolladores hacen de verdad — renombrar pestañas y reordenarlas:
' Por nombre: legible, pero el nombre de la pestana lo edita el usuario
Set ws = ThisWorkbook.Worksheets("Jan")
' el usuario renombra la pestana a "January" -> Subscript out of range
' Por indice: basado en la posicion, bien hasta que las pestanas se mueven
Set ws = ThisWorkbook.Worksheets(1)
' el usuario arrastra "Summary" al frente -> ahora apunta a la hoja equivocada
' Por CodeName: nombre interno solo para desarrolladores, invisible al usuario
Set ws = Sheet1
' renombra la pestana, reordena las pestanas -> sigue siendo la misma hoja
El nombre es el más amable de leer y el más fácil de romper para un usuario. El índice sobrevive a los renombrados pero no a las reordenaciones. El CodeName — fijado una vez en la ventana Propiedades del editor de VBA, bajo (Name) — es el único que sobrevive a ambos, porque no hay ningún botón en la interfaz de Excel que lo cambie. Para cualquier hoja que viaje como parte de tu herramienta, el CodeName es la referencia robusta.
La trampa silenciosa: una macro que muere con un renombrado
Este es el fallo que genera el ticket de soporte. Tu macro lee Worksheets("Data") y funciona durante meses.
Un usuario ordena y renombra la pestaña de Data a 2026 Data. Nada de tu código cambió y, sin embargo, cada
ejecución se detiene ahora con Subscript out of range en la línea que nombra la hoja — y el mensaje apunta a
la búsqueda, no al renombrado que de verdad lo causó.
' FRAGIL - a un renombrado de romperse
ThisWorkbook.Worksheets("Data").Range("A1").Value = total
' ROBUSTO - el CodeName no se puede cambiar desde la interfaz de Excel
Sheet1.Range("A1").Value = total
Si tienes que apoyarte en el nombre de la pestaña (para hojas que crea el usuario), protégelo: comprueba que la hoja existe antes de tocarla, o recorre la colección y busca coincidencia. Pero para las hojas que son tuyas, sáltate la fragilidad por completo y usa el CodeName. Es la diferencia entre una macro que sobrevive a un orden de limpieza y una que no.
La opinión: asigna una vez, calificada, prefiere el CodeName
Direcciona una hoja una vez, al principio de la macro, en una variable Worksheet — calificada por un libro —
y trabaja a través de esa variable en todo lo que venga después. Se lee mejor, es más rápido que volver a
buscar la hoja en cada línea, y pone la única referencia frágil en exactamente un lugar en vez de esparcirla
por el código.
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Jan") ' una busqueda, calificada
ws.Range("A1").Value = 100
ws.Range("A2").Value = 200 ' sin volver a buscar, sin ambiguedad
Para las hojas que tú controlas, haz que esa referencia sea el CodeName (Set ws = Sheet1) para que un
usuario que renombre la pestaña nunca llegue a tu código. Reserva la cadena de nombre para las hojas que son
del usuario, y protégelas. El objetivo es el mismo que recorre todo este grupo de guías: di exactamente a qué
objeto te refieres, una vez, y no dejes nunca a la macro adivinando.
Cuando preferirías describir la hoja en vez de perseguirla
La mitad de la batalla con las hojas es contabilidad — qué pestaña, qué nombre, si todavía existe, en qué libro está. ExcelMaster te deja saltarte la contabilidad: describe el resultado — «para cada pestaña mensual de este archivo, totaliza la columna D en la hoja de resumen» — y escribe y ejecuta código que califica cada referencia y gestiona las hojas que faltan o que fueron renombradas, respaldando tu libro primero. Tú nombras el resultado que quieres; él resuelve las hojas de forma segura para que un renombrado o una reordenación no tumbe la macro entera.
Preguntas frecuentes
¿Cuál es la diferencia entre Worksheets y Sheets en VBA?
Worksheets es la colección solo de las hojas de cálculo de cuadrícula. Sheets es la colección de todas las
pestañas, incluidas las hojas de gráfico. Devuelven lo mismo cuando un libro no tiene hojas de gráfico, pero
un bucle sobre Sheets que da por hecho que cada elemento es una hoja de cálculo dará error en una hoja de
gráfico. Usa Worksheets salvo que quieras incluir a propósito las hojas de gráfico.
¿Cómo referencio una hoja por nombre en VBA?
Usa ThisWorkbook.Worksheets("SheetName"), con el libro delante para que la búsqueda ocurra en el archivo que
quieres. El nombre debe coincidir exactamente con el texto de la pestaña, y si la hoja no existe obtienes
Subscript out of range. Para las hojas que tú controlas, el CodeName es una referencia más robusta porque
los usuarios no pueden cambiarlo.
¿Qué es un CodeName de hoja en VBA?
El CodeName es el nombre interno de una hoja — como Sheet1 — que fijas en la ventana Propiedades del editor
de VBA, bajo (Name). A diferencia del nombre de la pestaña, no hay forma de que un usuario lo cambie desde la
interfaz de Excel, así que una referencia como Sheet1.Range("A1") sigue funcionando incluso después de
renombrar o mover la pestaña.
¿Cómo asigno una hoja a una variable en VBA?
Decláralo con Dim ws As Worksheet y luego Set ws = ThisWorkbook.Worksheets("Jan") (o Set ws = Sheet1
para el CodeName). Asignarlo una vez, calificado por un libro, hace que el resto de tu macro trabaje a través
de ws sin volver a buscar la hoja ni depender de lo que esté activo.
¿Por qué obtengo Subscript out of range en Worksheets?
Porque el nombre o el índice que pediste no está en la colección — normalmente una pestaña que fue renombrada o borrada, o un nombre tecleado con la ortografía equivocada o con espacios de más. Comprueba que la hoja existe antes de tocarla, o referénciala por CodeName para que un renombrado no pueda romper la búsqueda.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 07/09/2026.
Guías relacionadas: VBA ThisWorkbook · VBA ActiveWorkbook · VBA Worksheet · VBA Range · VBA Cells
