Macro para cambiar nombre en hoja de excel

Me gustaría cambiar el nombre de cada hoja y que lo haga automáticamente cuando se cambie el nombre que hay en la celda r1 de la mimsma hoja

2 respuestas

Respuesta
2

De clic derecho en la hoja en cuestión y de clic en Ver código y ponga este código

Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveSheet.Name = Range("R1").Value
End Sub
Respuesta
1

Me gustaría cambiar el nombre de cada hoja

Si quieres aplicarlo para todas las hojas del libro, pon el siguiente código en los eventos de Thisworkbook.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  If Target.Address(0, 0) = "R1" Then
    If Target.CountLarge > 1 Then Exit Sub
    If Target.Value = "" Then Exit Sub
    If Evaluate("ISREF('" & Target.Value & "'!A1)") Then
      MsgBox "El nombre ya existe"
    Else
      Sh.Name = Target.Value
    End If
  End If
End Sub

Instrucciones para poner la macro en los eventos ThisWorkbook

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a ThisWorkbook
  4. En el panel del lado derecho copia la macro

funciona bien pero no exactamente como yo quiero, la celda r1 se copia de otra celda de otra hoja entonces solo coge el primer cambio si vuelvo a cambiarlo ya no cambia, por el contrario si yo modifico r1 manualmente siempre cambia

¿En la celda R1 tienes una fórmula?

Pon aquí la fórmula.

¿Solamente vas a cambiar el nombre de una hoja o son varias?

Si en la celda r1 hay una fórmula que seria la siguiente, =GASTOS!A5

Serian varias hojas las que tengo que cambiar pero cada una seria independiente, cada una llevaría un nombre distinto y a su vez todas tendrían la misma fórmula en r1 pero variando el nombre, ejemplo anterior seria =GASTOS!A5 y en otra pues podria ser =LIQUIDACION!A5

=GASTOS!A5 

Y en la celda A5 de la hoja GASTOS, ¿tienes otra fórmula o capturas un dato?

Y por qué quieres cambiar el nombre de la hoja de esa manera, cuál es el objetivo final de cambiar el nombre cada que se modifica la celda A5 de la hoja GASTOS.

En la celda a5 de la hoja gastos no tiene fórmula es un valor que modifico a mano, quiero que se cambie automático porque tengo muchas celdas y muchos apartados dentro de varias hojas que para mi es más fácil que se cambie en automático cambiando solo el valor en un sitio en concreto y no tener que ir cambiando a mano todo,

Sigo sin entender tu objetivo de cambiar el nombre de una hoja desde una celda.

Si modificas el nombre de la hoja, en automático todas las fórmulas que utilizan el nombre anterior, son actualizadas con el nombre nuevo.

Pero supongo que debes tener una buena razón.


Elimina los códigos anteriores.

Pon el siguiente código pero en los eventos de la hoja "GASTOS"

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sh As Worksheet
  Dim nuevo As String
  Dim a As Variant, arr As Variant
  '
  If Target.Address(0, 0) = "A5" Then
    If Target.CountLarge > 1 Then Exit Sub
    nuevo = Target.Value
    If nuevo = "" Then Exit Sub
    If Len(nuevo) > 30 Then Exit Sub
    '
    arr = Array(":", "\", "/", "?", "*", "[", "]")
    For Each a In arr
      If InStr(1, nuevo, a) > 0 Then
        MsgBox "El nuevo nombre no debe contener " & Join(arr, " "), vbCritical, "Cambiar nombre de hoja"
        Exit Sub
      End If
    Next
    '
    For Each sh In Sheets
      If LCase(sh.Range("R1").Formula) = LCase("=GASTOS!A5") Then
        If LCase(sh.Name) <> LCase(nuevo) Then
          If Evaluate("ISREF('" & nuevo & "'!A1)") Then
            MsgBox "El nombre ya existe"
          Else
            sh.Name = nuevo
          End If
        End If
      End If
    Next
  End If
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(GASTOS)
  4. En el panel del lado derecho copia la macro

Regresa a tu hoja GASTOS, cambia el dato en la celda A5, en automático el nombre de la hoja que en la celda R1 tiene la fórmula: "=GASTOS!A5" cambiará de nombre.

Si se que es difícil de entender pero si lo vieras lo entenderías, también se que las fórmulas se cambiarían pero en las hojas que quiero que se cambien los nombres no hay fórmulas.

Por ultimo la fórmula funciona perfectamente pero necesitaría que me hiciera lo mismo en varias hojas tal que quedaría que si cambio por ejemplo a1 en la hoja gastos se cambi el nombre de una hoja, si cambio en la celda a2 de gastos se cambi el nombre en otra hoja y así sucesivamente

La fórmula funciona perfectamente pero necesitaría que me hiciera lo mismo en varias hojas ... si cambio en la celda a2 de gastos se cambi el nombre en otra hoja

Reemplaza el código anterior por el siguiente.

En esta línea del código estoy indicando que las celdas A2 a A5 entrarán en el proceso:

If Not Intersect(Target, Range("A2:A5")) Is Nothing Then

Si tienes más celdas, entonces cambia en la macro el rango. 

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sh As Worksheet
  Dim nuevo As String
  Dim a As Variant, arr As Variant
  '
  If Not Intersect(Target, Range("A2:A5")) Is Nothing Then
    If Target.CountLarge > 1 Then Exit Sub
    nuevo = Target.Value
    If nuevo = "" Then Exit Sub
    If Len(nuevo) > 30 Then Exit Sub
    '
    arr = Array(":", "\", "/", "?", "*", "[", "]")
    For Each a In arr
      If InStr(1, nuevo, a) > 0 Then
        MsgBox "El nuevo nombre no debe contener " & Join(arr, " "), vbCritical, "Cambiar nombre de hoja"
        Exit Sub
      End If
    Next
    '
    For Each sh In Sheets
      If LCase(sh.Range("R1").Formula) = LCase("=GASTOS!" & Target.Address(0, 0)) Then
        If LCase(sh.Name) <> LCase(nuevo) Then
          If Evaluate("ISREF('" & nuevo & "'!A1)") Then
            MsgBox "El nombre ya existe"
          Else
            sh.Name = nuevo
          End If
        End If
      End If
    Next
  End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas