Validación de datos en celda

Estoy armando una rutina para nombrar las hojas de un libro, según el valor de la correspondiente celda A1 en cada hoja.

Sub ForEach_WorkBook()
'Nombra a cada Sheet del Workbook, con el valor de cada correspondiente celda (A1)
Dim wsItem As Worksheet
For Each wsItem In ThisWorkbook.Worksheets
    wsItem.Name = wsItem.Range("A1")
Next wsItem
End Sub

Me he dado cuenta que si la celda contiene los siguientes valores: / \ ? * ' o si la celda es vacía,  da error (Excel no permite esos caracteres)

¿Cómo puedo retocar el código para contemplar esa situación?

1 Respuesta

Respuesta
2

Una opción es colocar un control de error para que siga de largo y en ese caso la hoja no se renombra:

For each....

On error resume next

WsItem.name...

On error go to 0

Next ...

Otra opción es la siguiente, que te permite ingresar el nombre cuando se presenta un error :

Sub ForEach_WorkBook()
'Nombra a cada Sheet del Workbook, con el valor de cada correspondiente celda (A1)
Dim wsItem As Worksheet
For Each wsItem In ThisWorkbook.Worksheets
On Error Resume Next
wsItem.Name = wsItem.Range("A1")
'si presenta un error permite ingresar el nombre
If Err.Number > 0 Then
    nbre = InputBox("La hoja " & wsItem.Name & " no tiene valor apto para asignarlo como nombre. Ingresa un nombre.", "INGRESAR NOMBRE")
    wsItem.Name = nbre
    On Error GoTo 0
End If
On Error GoTo 0
Next wsItem
End Sub

Saludos y no olvides valorar la respuesta si el tema queda resuelto. Sino comenta o solicita aclaraciones.

Se me fue una línea demás, así es lo correcto:

Sub ForEach_WorkBook()
'Nombra a cada Sheet del Workbook, con el valor de cada correspondiente celda (A1)
Dim wsItem As Worksheet
For Each wsItem In ThisWorkbook.Worksheets
On Error Resume Next
wsItem.Name = wsItem.Range("A1")
'si presenta un error permite ingresar el nombre
If Err.Number > 0 Then
    nbre = InputBox("La hoja " & wsItem.Name & " no tiene valor apto para asignarlo como nombre. Ingresa un nombre.", "INGRESAR NOMBRE")
    wsItem.Name = nbre
End If
On Error GoTo 0
Next wsItem
End Sub

Sdos!

Hola, muchas gracias por tu dedicación.

Voy a revisar lo propuesto y te comento cómo me fue.

Gracias.

No tenías porqué valorar antes de probarlo... si luego comprobás que las 2 opciones son perfectas para tu caso espero mejores tu valuación.

Sdos!

Hola!! Perdon que me demoré en testear.

Anda bastante bien.

Lo que no se ha resuelto es que cuando me sale el inbox (luego de que revisa que en celda A1 los caracteres no son válidos)  y vuelvo a ingresar un carácter no válido, no sigue en la corrección del error. Ahí termina la rutina y el nombre no queda correcto.

nbre = InputBox("La hoja " & wsItem.Name & " no tiene valor apto para asignarlo como nombre. Ingresa un nombre.", "INGRESAR NOMBRE")

Se puede establecer un loop (o lo que consideres necesario) donde se dictamine que si no se ingresa un nombre válido se sigue preguntando hasta que se ponga "cancelar" en el inbox?

Gracias.

Aquí va:

Sub ForEach_WorkBook()
'x Elsamatilde
'Nombra a cada Sheet del Workbook, con el valor de cada correspondiente celda (A1)
Dim wsItem As Worksheet
For Each wsItem In ThisWorkbook.Worksheets
    On Error Resume Next
    wsItem.Name = wsItem.Range("A1")
    'si presenta un error permite ingresar el nombre
errando:
    If Err.Number > 0 Then
        nbre = InputBox("La hoja " & wsItem.Name & " no tiene valor apto para asignarlo como nombre. Ingresa un nombre.", "INGRESAR NOMBRE")
        If nbre <> "" Then     'si se cancela no modifica el nombre que ya tiene la hoja
            Err.Number = ""
            On Error Resume Next
            wsItem.Name = nbre
            If Err.Number > 0 Then GoTo errando
        End If
    End If
    On Error GoTo 0
Next wsItem
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas