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

VBA Rename Sheet en Excel — qué actualiza un cambio de nombre y qué rompe en silencio

|

VBA Rename Sheet en Excel — qué actualiza un cambio de nombre y qué rompe en silencio

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 de INDIRECT, destinos de hipervínculos y tus propias macros que dicen Worksheets("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 (sales choca con Sales).
  • 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