TL;DR —
ws.Name = "Sales 2026"renombra una hoja. La línea es trivial; las consecuencias, no. Un cambio de nombre es una refactorización: Excel reescribe cada referencia que sabe interpretar — fórmulas de celda, nombres definidos, series de gráficos, listas de validación— y deja cada referencia que es solo texto apuntando a un nombre que ya no existe: cadenas deINDIRECT, destinos de hipervínculos y tus propias macros que dicenWorksheets("Sales"). Antes de renombrar, averigua de cuál de las dos depende tu libro. Construye los nombres pasando por una función saneadora, nunca directamente desde una celda, y ancla tu propio código en el CodeName, que ningún cambio de nombre puede tocar.
Sub RenameMonthSheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Template")
ws.Name = "Report " & Format(Date, "yyyy-mm") ' nunca una fecha a pelo: 9/30/2026 contiene /
End Sub
Este es el primero de una serie de tres artículos sobre la identidad de una hoja. El nombre de la pestaña es una etiqueta que pertenece al usuario. Renombrar cambia esa etiqueta, ocultar quita la pestaña de la vista sin dejar la hoja fuera de alcance, y comprobar si una hoja existe pregunta si una etiqueta ya está ocupada antes de fiarte de ella. El código que tiene que sobrevivir a los usuarios se ancla en algo que ellos no pueden cambiar; el código que no tiene más remedio que usar un nombre, lo comprueba primero.
Lo que aprenderás
- El modelo mental: un cambio de nombre es una refactorización con dos tipos de referencias
- Qué actualiza Excel por ti, y qué deja roto sin avisar
- Las reglas de nombres que hay detrás del error 1004, y una función saneadora que las respeta
- Por qué nombrar una hoja a partir de una celda con fecha funciona en un país y revienta en otro
- Renombrar en bloque, e intercambiar dos nombres sin colisión
- Leer el nombre de una hoja, en VBA y en una fórmula
El modelo mental: renombrar es refactorizar
Toda referencia a una hoja es de uno de dos tipos. Una referencia interpretada es algo que Excel entiende
como un puntero: =Sales!B4 en una celda, un nombre definido que hace referencia a Sales!$A$1:$A$50, una
serie de gráfico, una lista de validación de datos. Excel las guarda como punteros a la hoja, así que cuando
cambia el nombre reescribe el texto por ti: =Sales!B4 pasa a ser ='Sales 2026'!B4, con comillas simples
añadidas por el espacio.
Una referencia de texto es una cadena que casualmente deletrea el nombre. Excel no tiene ni idea de que apunte a ningún sitio, así que un cambio de nombre la deja exactamente como estaba, y ahora apuntando a la nada:
| Referencia | Tipo | Tras el cambio de nombre |
|---|---|---|
=Sales!B4 en una celda |
interpretada | se actualiza sola |
| Nombres definidos, series de gráficos, listas de validación, formatos condicionales | interpretada | se actualiza sola |
| Fórmulas de otros libros que están abiertos | interpretada | se actualiza sola |
=INDIRECT("Sales!B4") |
texto | #REF! |
=HYPERLINK("#Sales!A1", "Go") e hipervínculos insertados |
texto | el vínculo no lleva a ninguna parte |
Worksheets("Sales") en VBA |
texto | error en tiempo de ejecución 9 |
| Vínculos desde libros que están cerrados durante el cambio | ruta guardada | se rompen en la siguiente actualización |
Esa tabla es el artículo entero en miniatura. El cambio de nombre en sí nunca falla en silencio; lo que falla son sus referencias de texto.
Renombra una hoja y vuelve a leer su nombre
La mecánica es una sola propiedad, de lectura y escritura:
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sales")
Debug.Print ws.Name ' lectura: "Sales"
ws.Name = "Sales 2026" ' escritura: la pestana cambia al instante
Debug.Print ActiveSheet.Name ' el nombre de la hoja que este activa
Guarda la hoja en una variable antes de renombrarla, como arriba. Una vez que cambia el nombre,
Worksheets("Sales") ya no la encuentra, pero la variable sigue apuntando al mismo objeto hoja, así que el
resto de la macro sigue funcionando. Es la misma razón por la que tu código de larga vida debería usar el
CodeName de la hoja (Sheet3, fijado en la ventana Propiedades del editor de VBA): es una referencia
interpretada dentro de VBA, y la guía de Worksheets muestra por qué ningún cambio
de nombre de pestaña puede romperla. El CodeName es de solo lectura mientras se ejecuta el código, así que no
puedes cambiar el CodeName de una hoja desde una macro como cambias el nombre de su pestaña.
Para mostrar el nombre de la hoja en una celda, usa una fórmula en lugar de código:
' En una celda (Excel 365): =TEXTAFTER(CELL("filename", A1), "]")
' Devuelve el nombre de la hoja donde esta la formula; vacio hasta que se guarda el libro.
Las reglas de nombres detrás del error 1004
Excel rechaza cualquier nombre que incumpla alguna de sus reglas, y todos los rechazos son el mismo error en tiempo de ejecución 1004:
- 31 caracteres como máximo, y no vacío.
- Ninguno de
:\/?*[]. - Sin apóstrofo como primer ni como último carácter.
- No igual al de otra hoja del libro, sin distinguir mayúsculas (
saleschoca conSales). - No
History, que el Excel en inglés reserva para su hoja de control de cambios.
La guía de Add Sheet trata estas reglas en el momento en que una hoja nueva recibe su primer nombre. Para los cambios de nombre, la respuesta práctica es no asignar nunca un nombre que no hayas limpiado. Una pequeña función saneadora cubre todas las reglas salvo la unicidad:
Function SafeSheetName(ByVal s As String) As String
Dim ch As Variant
For Each ch In Array(":", "\", "/", "?", "*", "[", "]")
s = Replace(s, ch, "-")
Next ch
s = Left$(Trim$(s), 31)
Do While Left$(s, 1) = "'"
s = Mid$(s, 2)
Loop
Do While Right$(s, 1) = "'"
s = Left$(s, Len(s) - 1)
Loop
If Len(s) = 0 Then s = "Sheet"
SafeSheetName = s
End Function
Recorta antes de quitar los apóstrofos, no después: cortar a 31 caracteres puede dejar un apóstrofo al descubierto en el nuevo final.
La trampa: nombrar una hoja a partir de una celda
El cambio de nombre más habitual en los libros reales es «ponle a cada hoja el nombre del valor de A1». Parece inofensivo:
ws.Name = ws.Range("A1").Value ' A1 contiene una fecha
Si A1 contiene una fecha, .Value devuelve un Date, y VBA lo convierte en texto usando el formato de
fecha corta de la configuración regional del equipo. En un PC alemán eso es 30.09.2026, un nombre de hoja
perfectamente legal. En un PC de EE. UU. es 9/30/2026, y las barras lanzan el error 1004. La misma macro
supera todas las pruebas en Múnich y revienta en Chicago. Un PC configurado para España o Latinoamérica da
30/09/2026, que también lleva barras y también falla. Los números arrastran una versión más discreta del
mismo problema: el separador decimal también cambia con la región.
La solución es decidir tú el texto y luego sanearlo:
Dim v As Variant
v = ws.Range("A1").Value
If IsDate(v) Then
ws.Name = SafeSheetName(Format(v, "yyyy-mm-dd"))
Else
ws.Name = SafeSheetName(CStr(v))
End If
Format con un patrón explícito produce el mismo texto en cualquier equipo. Esa es la regla para cualquier
nombre construido a partir de datos: el formato lo decides tú, no la configuración regional.
Renombrar en bloque e intercambiar dos nombres
Los cambios de nombre en bloque fallan por colisiones, normalmente a mitad de camino, y dejan el libro medio renombrado. Dos hábitos lo evitan. Primero, haz que cada nombre de destino sea único antes de asignarlo, usando la comprobación de si la hoja existe:
Function UniqueSheetName(wb As Workbook, ByVal base As String) As String
Dim nm As String, n As Long
nm = base
Do While SheetExists(nm, wb)
n = n + 1
nm = Left$(base, 31 - Len(" (" & n & ")")) & " (" & n & ")"
Loop
UniqueSheetName = nm
End Function
Segundo, cuando dos hojas se intercambian los nombres, pasa por un nombre temporal. Renombrar A como B
mientras B todavía existe es un duplicado y lanza 1004; un intercambio en tres pasos nunca choca:
Sub SwapSheetNames(ws1 As Worksheet, ws2 As Worksheet)
Dim n1 As String, n2 As String
n1 = ws1.Name: n2 = ws2.Name
ws1.Name = "~swap~"
ws2.Name = n1
ws1.Name = n2
End Sub
Cambiar solo las mayúsculas —de sales a Sales— no es una colisión: es la misma hoja, y Excel lo acepta.
La decisión: busca las referencias de texto antes de renombrar
Un cambio de nombre hecho a mano tiene el mismo efecto que uno hecho por código, así que la decisión no va de
VBA. Va de de qué tipo de referencia depende el libro. Si todo lo que apunta a la hoja son referencias
interpretadas, renombra sin miedo: Excel hace la refactorización. Si algo deletrea el nombre como texto
—INDIRECT, un hipervínculo, una macro, un paso de Power Query que lee la hoja por su nombre—, busca antes el
nombre antiguo (Ctrl+B, Buscar en: Fórmulas, Dentro de: Libro, y Ctrl+Mayús+F en el editor de VBA)
y arregla esas referencias en el mismo cambio. Mi regla: renombra las hojas que ve el usuario, pero nunca
hagas que tu código dependa de cómo se llaman. Mantén tus macros sobre CodeNames o sobre variables que
asignas una vez con Set, y un cambio de nombre seguirá siendo lo que debe ser: un cambio de etiqueta.
Cómo te ayuda ExcelMaster
Los problemas de un cambio de nombre aparecen lejos del cambio: un INDIRECT que se convierte en #REF! el
mes siguiente, una macro que muere con el error 9 la primera vez que un compañero ordena las pestañas, una
hoja mensual que solo falla en el portátil configurado con fechas de EE. UU.
ExcelMaster te deja describir el trabajo —«ponle a cada hoja el nombre de la región que hay en A1, y arregla todo lo que siga apuntando a los nombres antiguos»— y escribe el cambio de nombre con nombres saneados y únicos, y luego encuentra las referencias de texto que el cambio dejaría atrás y las actualiza en la misma pasada.
Preguntas frecuentes
¿Cómo renombro una hoja en VBA?
Asigna su propiedad Name: Worksheets("Sheet1").Name = "Sales", o ActiveSheet.Name = "Sales" para la
hoja activa. Guarda antes la hoja en una variable si la macro la sigue usando después, porque
Worksheets("Sheet1") deja de encontrarla en cuanto cambia el nombre.
¿Por qué obtengo el error 1004 al renombrar una hoja?
El nombre incumple una regla: tiene más de 31 caracteres, está vacío, contiene alguno de : \ / ? * [ ],
empieza o termina con un apóstrofo, es History, o coincide con otra hoja del libro sin importar las
mayúsculas. Limpia el nombre con una función saneadora y comprueba que no esté ya ocupado antes de asignarlo.
¿Se actualizan las fórmulas cuando renombro una hoja?
Las fórmulas que hacen referencia directa a la hoja, como =Sales!B4, se actualizan solas, igual que los
nombres definidos, los gráficos y las listas de validación. Las referencias escritas como texto no:
INDIRECT("Sales!B4"), los destinos de hipervínculos y las cadenas de VBA como Worksheets("Sales")
conservan el nombre antiguo y se rompen.
¿Cómo renombro una hoja con el valor de una celda?
Lee la celda, convierte tú mismo el valor en texto y luego sanéalo: usa Format(value, "yyyy-mm-dd") para
las fechas y CStr para todo lo demás, y pasa el resultado por una función que quite los caracteres
ilegales. Asignar directamente una celda con fecha hace que el nombre dependa del formato de fecha regional
del PC.
¿Cómo obtengo el nombre de la hoja activa en VBA?
Lee ActiveSheet.Name. Para una hoja concreta, lee ws.Name sobre una variable de hoja. Para mostrar el
nombre de una hoja en una de sus celdas, usa =TEXTAFTER(CELL("filename", A1), "]") en Excel 365, que
funciona una vez que el libro se ha guardado.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 30/09/2026.
Guías relacionadas: VBA Hide Sheet · VBA Check If Sheet Exists · VBA Worksheets · VBA Add Sheet · VBA Copy Sheet · VBA Format · VBA Replace · VBA Named Range
