Nombres de hojas VB y mostrar esconder hojas

Tengo en un libro excel una lista de personas en la Hoja1, con la facturación de cada una, y, con el nombre de cada persona de esa lista vertical, actualizo el nombre de cada hoja que corresponde a los datos de facturación de cada persona, para hacer un seguimiento. Pero me encuentro en la tesitura que se me acumulan personas (y por lo tanto hojas) en el libro, y quiero poder esconder las que yo marque desde la lista en Hoja1 como "BAJAS", poniendo un 1 en la celda correspondiente de baja.

En cada hoja2 y Hoja3 y siguientes: A1 es el valor calculado del nombre en la hoja "lista de personas" y es igual a: =Hoja1!B2, =Hoja1!B3 =Hoja1! B4 y así seguido hasta completar tantas hojas como nombres tengo en la lista de la Hoja1.

De momento, cada hoja2 y 3 y succesivas recibe como instrucción:

Private Sub Worksheet_Activate()
ActiveSheet.Name = Range("A1").Value
End Sub

Así cada hoja recibe automáticamente el nombre según el valor A1 que viene de la lista de nombres de Hoja1.

Y la hoja1 que tiene la lista completa de las personas, tiene como instrucción para esconder cada hoja marcada:

Private Sub Worksheet_Change(ByVal Target As Range)
If [D2] = "1" Then
Sheets(Hoja2).Visible = True
Else
Sheets(Hoja2).Visible = False
End If
If [D3] = "1" Then
Sheets(Hoja3).Visible = True
Else
Sheets(Hoja3).Visible = False
End If
End Sub

El problema es que en esta ultima instrucción topo porque no se como poner el nombre actual de cada hoja (que no es Hoja2 o Hoja3 o siguientes ) sino el nombre que le corresponde desde la lista de Hoja1. Evidentemente tengo siempre el error de finalizar/depurar, a cada cambio de estado del nombre y de la baja/alta....!

Como puedo hacer en esta instrucción, ¿para poner el nombre que tenga realmente cada hoja del libro según la lista de la primera hoja?

No se si me expreso bien.

¿

Respuesta
1

Ocupas tres macros una para que te haga un listado de las hojas en la hoja baja, en esa hoja marcas que hojas vas a ocultar con una POR, corres la segunda macro, que ocultara todo lo que tenga una POR, la tercera es opcional para mostrar todas las hojas mediante un click de un botón, y estas son las macros

Sub listar_hojas()
x = 1
For Each hoja In Worksheets
    nombre = hoja.Name
    Sheets("bajas").Range("a2").Cells(x, 1) = nombre
    x = x + 1
Next hoja
End Sub
Sub ocultar_hojas()
Set hb = Sheets("bajas")
Set hojas = hb.Range("a2").CurrentRegion
With hojas
    filas = .Rows.Count
    For i = 1 To filas
        nombre = .Cells(i, 1)
        valor = .Cells(i, 2)
        Sheets(nombre).visible = UCase(.Cells(i, 2)) <> "X"
    Next i
End With
End Sub
Sub visible()
For Each hoja In Worksheets
    Sheets(hoja.Name).visible = True
Next hoja
End Sub

¡Gracias! Pero no me sirve. Quiero conocer el nombre real de cada hoja para usarlo en una función vba... 

En una hoja solo hay dos nombres el que tiene en la pestaña y el nombre interno de la hoja por ejemplo: en mi caso la pestaña tiene el nombre de bajas y el nombre interno de la hoja es Hoja16, entonces según entiendo tu lo que quieres es el nombre interno así que esta es la macro para conseguirlo, la instrucción en cualquier otra macro seria nombre=sheets("bajas"). Codename.

Sub listar_hojas()
x = 1
For Each hoja In Worksheets
    nombre = hoja.CodeName
    Sheets("bajas").Range("a2").Cells(x, 1) = nombre
    x = x + 1
Next hoja
End Sub

1 respuesta más de otro experto

Respuesta
1

Creo que en tu caso en especifico, podrías usar el Index. Usar el index es siempre una ultima opcion, pero creo que lo vas a necesitar.

El index es la posición de la hoja. Por ejemplo:

Sheets(2).Visible = True

Sheets(3).Visible = True

Sheets(4).Visible = True

Etc etc.

Solo debes asegurarte que te refieres a la posición correcta y que estas varíen poco o nada.

¡Gracias! 

Buenas. Solventado. 

Private Sub Worksheet_Change(ByVal Target As Range)
Hoja2.Visible = xlSheetVisible
Hoja3.Visible = xlSheetVisible
Hoja4.Visible = xlSheetVisible
If [D2] = "1" Then Hoja2.Visible = xlSheetHidden
If [D3] = "1" Then Hoja3.Visible = xlSheetHidden
If [D4] = "1" Then Hoja4.Visible = xlSheetHidden
End Sub

Tambien habia probado esto con variables de tipo Varian:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Texto2 As Variant
Dim Texto3 As Variant
Dim Texto4 As Variant
Texto2 = (Hoja2.Name)
Texto3 = (Hoja3.Name)
Texto4 = (Hoja4.Name)
If [D2] = "1" Then
Sheets(Texto2).Visible = False
Else
Sheets(Texto2).Visible = True
End If
If [D3] = "1" Then
Sheets(Texto3).Visible = False
Else
Sheets(Texto3).Visible = True
End If
If [D4] = "1" Then
Sheets(Texto4).Visible = False
Else
Sheets(Texto4).Visible = True
End If
End Sub

Tambien funciona, pero la primero funccion es mas elegante.

Saludos y gracias

Felicidades

Gracias a todos. Ahora me preocupa poder esconder unos rangos de celdas dentro de unas hojas, con las mismas coindiciones, es decir si D2 =1 entonces esconder en hoja2018, y en hoja2019, el rango idéntico que hay en cada hoa pongamos que B3:C5. ¿Cómo hacerlo en VB y añadirlo a la fórmula anterior?

Deberías abrir una pregunta nueva

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas