Macro que oculte hojas

31/08/2007 - 16:06 por Marta | Informe spam
Hola a todos,

A ver si me echáis una manita con esto.

Tengo un documento con varias hojas, la primera de ellas siempre se ve y las
demás están ocultas.
En la primera hoja (la que está siempre visible) hay una serie de botones
cada uno con una macro. Si pincho en el botón 1 la macro lo que hace es
mostrar de las hojas ocultas aquellas que relacionadas con el grupo 1. Si
pincho en el botón 2, me muestra de las hojas ocultas las relacionadas con el
grupo 2... y así sucesivamente con todos los botones que tengo.

El problema es que lo que quiero es que si por ejemplo, pincho en botón 1 y
se muestran todas las hojas del grupo 1. Si ahora pincho en el botón 2 quiero
que se oculten todas las que no sean del grupo 2 y se muestren las del grupo
2.

No consigo hacer una macro que diga "ocultar todas las hojas que están
visibles excepto la hoja Control Panel" (que es la primera, donde están los
botones)... ya que cada hoja tiene nombres distintos y cada vez que pincho en
un botón de antemano no sé cómo se van a llamar las hojas que están mostradas
y quiero ocultar.

¿Me explico?

Pues eso, muchísimas gracias a todos por vuestra ayuda,
Martape

Preguntas similare

Leer las respuestas

#6 Marta
02/09/2007 - 19:36 | Informe spam
Hola Héctor!

Mil gracias por toda tu ayuda. Sin embargo, algo no va bien, te cuento:

1) Cambié el nombre al botón 1, por All, y al 7, por Nrds.
2) En un módulo estandard pegué todas las líneas de código de tu mail.
3) A cada uno de los 7 botones le asigné la macro "Grupo_x".

Resultado... pincho en cualquiera de los botones y me sale un error a través
de una ventana de Microsoft Visual Basic, que dice:
Run-time error 9:
Subscript out of range.
Doy a Debug y veo que aparece en amarilla la siguiente línea (dentro de la
parte de Private Sub Oculta_todas():
Worksheets(nHojas(hX) & "_" & Gpo(gX)).Visible = sxSeetVeryHidden

No sé si te ayudará saber dos cosas, además:
- El Excel lo tengo en inglés.
- Creo que no afecta en absoluto a tu idea ni nada, pero por si acaso, como
detalle, la hoja donde tengo los 7 botones, que nunca debe ocultarse sino
estar siempre visible, se llama Control_panel.

Muchísimas gracias de nuevo,
Martape

"Héctor Miguel" wrote:

hola, Marta !

1) con los siguientes *entendidos*:
a) 7 botones de la barra de herramientas formularios [NO cuadro de controles]
b) 7 grupos [uno por cada boton]: "All Markets", "UK", "DE", "FR", "ES", "NL" y "Nordics"
OJO: *presumo* que el anterior es el *titulo/nombre/Caption/...* escrito en cada boton ??? <= OJO
c) cada grupo con 4 hojas de nombre *generico*: "Summary_", "Totals_", "Averages_", Sickness Rate_"

2) haces las siguientes modificaciones:
a) los *Caption* [o titulo] de los botones 1 y 7 los cambias a 1="All" 7="Nrds" [para que coincidan con el *sufijo* de las hojas]
b) A TODOS los botones les asignas LA MISMA macro que en este ejemplo se llama: -> "Grupo_x()"
c) *el resto*... lo hacemos en el codigo [p.e.]
1) se ocultan todas las hojas excepto [obviamente] las que esten *fuera* de las constantes "Hojas" y "Grupos"
2) se muestran solo las hojas del boton *pinchado*
3) [adicionalmente] las hojas ocultas NO se muestran en el menu: formato / hoja / mostrar... :))
4) las ultimas lineas: -> #If Not VBA6 ... #End If son [y por si las dudas] solo aplicables cuando tu libro se ejecute en xl-97

3) copia/pega las siguientes lineas en un modulo de codigo normal/general/estandar/...
EN SUSTITUCION de todos los codigos que tenias asociados a cada boton y/o procedimiento para des/re/ocultar hojas <= OJO
y... cuando quieras/necesites ampliar/reducir los grupos y/o las hojas, solo revisa las constantes: "Hojas" y "Grupos" ;)

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Public Const Hojas As String = "totals,summary,averages,sickness rate"
Public Const Grupos As String = "all,uk,de,fr,es,nl,nrds"
Dim gX As Byte, Gpo, hX As Byte, nHojas
Sub Grupo_x()
Application.ScreenUpdating = False
Oculta_todas
nHojas = Split(Hojas, ",")
For hX = LBound(nHojas) To UBound(nHojas)
Worksheets(nHojas(hX) & "_" & _
ActiveSheet.Buttons(Application.Caller).Caption).Visible = True
Next
End Sub
Private Sub Oculta_todas()
Gpo = Split(Grupos, ",")
nHojas = Split(Hojas, ",")
For gX = LBound(Gpo) To UBound(Gpo)
For hX = LBound(nHojas) To UBound(nHojas)
Worksheets(nHojas(hX) & "_" & Gpo(gX)).Visible = xlSheetVeryHidden
Next
Next
End Sub
#If Not VBA6 Then
Function Split(Cadena As String, Delimitador As String) As Variant
Split = Evaluate("{""" & Application.Substitute(Cadena, Delimitador, """,""") & """}")
End Function
#End If

__ la consulta original __
> La opcion 1 me encantaria, pero... como se hace una macro que oculte todas las hojas que estan visibles?
> Como cada una tiene su nombre... seria lo ideal, se ejecuta y oculta todas las hojas que hay visibles [...]

> Opcion 2: te comento detalles:
> - Los botones son... desde la barra de herramientas de formulario, y a cada uno le he asignado una macro.
> - Tengo en total 7 grupos, cada uno de ellos tiene asociadas 4 hojas. Te pongo la estructura:
> Grupo 1: se llama "All Markets" y las hojas asociadas se llaman: "Summary_All", "Totals_All", "Averages_All", "Sickness Rate_All"
> Grupo 2: se llama "UK" y las hojas asociadas se llaman: "Summary_UK", "Totals_UK", "Averages_UK", "Sickness Rate_UK"
> Grupo 3: se llama "DE" y las hojas asociadas se llaman: "Summary_DE", "Totals_DE", "Averages_DE", "Sickness Rate_DE"
> Grupo 4: se llama "FR" y las hojas asociadas se llaman: "Summary_FR", "Totals_FR", "Averages_FR", "Sickness Rate_FR"
> Grupo 5: se llama "ES" y las hojas asociadas se llaman: "Summary_ES", "Totals_ES", "Averages_ES", "Sickness Rate_ES"
> Grupo 6: se llama "NL" y las hojas asociadas se llaman: "Summary_NL", "Totals_NL", "Averages_NL", "Sickness Rate_NL"
> Grupo 7: se llama "Nordics" y las hojas asociadas se llaman: "Summary_Nrds", "Totals_Nrds", "Averages_Nrds", "Sickness Rate_Nrds"
>
> - El codigo que se ejecuta al pinchar cada boton es muy simple.
> Si pincho en el de UK, la macro lo que hace es hacer visibles las cuatro pesta#as de UK. [...]



Respuesta Responder a este mensaje
#7 Marta
02/09/2007 - 19:56 | Informe spam
Hola Héctor,

Te cuento avances: en el código eliminé directamente la línea que aparecía
en amarillo... sospecho que esa línea es la que hace que las hojas ocultas NO
se muestran en el menu: formato / hoja / mostrar...
Realmente esto no me hace falta...

Entonces, elimino esta línea del código y ahora al pinchar en cualquier
botón, se hacen visibles las 4 hojas correspondientes a ese grupo. El
problema es que no se ocultan las demás, y necesitaría que se ocultaran.

Por otro lado, si aún estamos a tiempo... me gustaría que después de pinchar
en un botón y aparecer sus 4 pestañas, en lugar de quedar el cursor en la
pestaña de Control_panel, donde pinché en el botón, se active la pestaña
"Summary_x" del grupo que corresponda, y por lo tanto se quede el cursor en
esa pestaña Summary_x en la celda A1.

Saludos y mil gracias otra vez,
Martape

"Héctor Miguel" wrote:

hola, Marta !

1) con los siguientes *entendidos*:
a) 7 botones de la barra de herramientas formularios [NO cuadro de controles]
b) 7 grupos [uno por cada boton]: "All Markets", "UK", "DE", "FR", "ES", "NL" y "Nordics"
OJO: *presumo* que el anterior es el *titulo/nombre/Caption/...* escrito en cada boton ??? <= OJO
c) cada grupo con 4 hojas de nombre *generico*: "Summary_", "Totals_", "Averages_", Sickness Rate_"

2) haces las siguientes modificaciones:
a) los *Caption* [o titulo] de los botones 1 y 7 los cambias a 1="All" 7="Nrds" [para que coincidan con el *sufijo* de las hojas]
b) A TODOS los botones les asignas LA MISMA macro que en este ejemplo se llama: -> "Grupo_x()"
c) *el resto*... lo hacemos en el codigo [p.e.]
1) se ocultan todas las hojas excepto [obviamente] las que esten *fuera* de las constantes "Hojas" y "Grupos"
2) se muestran solo las hojas del boton *pinchado*
3) [adicionalmente] las hojas ocultas NO se muestran en el menu: formato / hoja / mostrar... :))
4) las ultimas lineas: -> #If Not VBA6 ... #End If son [y por si las dudas] solo aplicables cuando tu libro se ejecute en xl-97

3) copia/pega las siguientes lineas en un modulo de codigo normal/general/estandar/...
EN SUSTITUCION de todos los codigos que tenias asociados a cada boton y/o procedimiento para des/re/ocultar hojas <= OJO
y... cuando quieras/necesites ampliar/reducir los grupos y/o las hojas, solo revisa las constantes: "Hojas" y "Grupos" ;)

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Public Const Hojas As String = "totals,summary,averages,sickness rate"
Public Const Grupos As String = "all,uk,de,fr,es,nl,nrds"
Dim gX As Byte, Gpo, hX As Byte, nHojas
Sub Grupo_x()
Application.ScreenUpdating = False
Oculta_todas
nHojas = Split(Hojas, ",")
For hX = LBound(nHojas) To UBound(nHojas)
Worksheets(nHojas(hX) & "_" & _
ActiveSheet.Buttons(Application.Caller).Caption).Visible = True
Next
End Sub
Private Sub Oculta_todas()
Gpo = Split(Grupos, ",")
nHojas = Split(Hojas, ",")
For gX = LBound(Gpo) To UBound(Gpo)
For hX = LBound(nHojas) To UBound(nHojas)
Worksheets(nHojas(hX) & "_" & Gpo(gX)).Visible = xlSheetVeryHidden
Next
Next
End Sub
#If Not VBA6 Then
Function Split(Cadena As String, Delimitador As String) As Variant
Split = Evaluate("{""" & Application.Substitute(Cadena, Delimitador, """,""") & """}")
End Function
#End If

__ la consulta original __
> La opcion 1 me encantaria, pero... como se hace una macro que oculte todas las hojas que estan visibles?
> Como cada una tiene su nombre... seria lo ideal, se ejecuta y oculta todas las hojas que hay visibles [...]

> Opcion 2: te comento detalles:
> - Los botones son... desde la barra de herramientas de formulario, y a cada uno le he asignado una macro.
> - Tengo en total 7 grupos, cada uno de ellos tiene asociadas 4 hojas. Te pongo la estructura:
> Grupo 1: se llama "All Markets" y las hojas asociadas se llaman: "Summary_All", "Totals_All", "Averages_All", "Sickness Rate_All"
> Grupo 2: se llama "UK" y las hojas asociadas se llaman: "Summary_UK", "Totals_UK", "Averages_UK", "Sickness Rate_UK"
> Grupo 3: se llama "DE" y las hojas asociadas se llaman: "Summary_DE", "Totals_DE", "Averages_DE", "Sickness Rate_DE"
> Grupo 4: se llama "FR" y las hojas asociadas se llaman: "Summary_FR", "Totals_FR", "Averages_FR", "Sickness Rate_FR"
> Grupo 5: se llama "ES" y las hojas asociadas se llaman: "Summary_ES", "Totals_ES", "Averages_ES", "Sickness Rate_ES"
> Grupo 6: se llama "NL" y las hojas asociadas se llaman: "Summary_NL", "Totals_NL", "Averages_NL", "Sickness Rate_NL"
> Grupo 7: se llama "Nordics" y las hojas asociadas se llaman: "Summary_Nrds", "Totals_Nrds", "Averages_Nrds", "Sickness Rate_Nrds"
>
> - El codigo que se ejecuta al pinchar cada boton es muy simple.
> Si pincho en el de UK, la macro lo que hace es hacer visibles las cuatro pesta#as de UK. [...]



Respuesta Responder a este mensaje
#8 julian-vlc-sp
02/09/2007 - 20:12 | Informe spam
¡Importante!: Colabora con el grupo.Contesta a este mensaje
y dinos si te sirvió o no la respuesta dada. Muchas gracias.

Entiendo que en los distintos botones que mencionas tienes algo parecido a:

Sub BotónX_AlHacerClic()
Unas cuantas líneas de código
End Sub

Mi propuesta es que en un modulo pongas algo como lo siguiente:

Sub SoloControlPanel()
Dim UnaHoja As Worksheet
For Each UnaHoja In Worksheets
If UnaHoja.Name <> "Control panel" Then
UnaHoja.Visible = False
End If
Next
End Sub

y que después cambies los sub de tus botones poniéndolos como sigue:

Sub BotónX_AlHacerClic()
SoloControlPanel
Unas cuantas líneas de código
End Sub


SALUDOS.
Julián-Valencia-España
http://ijulian.iespana.es/


"Marta" escribió en el mensaje
news:
Hola a todos,

A ver si me echáis una manita con esto.

Tengo un documento con varias hojas, la primera de ellas siempre se ve y
las
demás están ocultas.
En la primera hoja (la que está siempre visible) hay una serie de botones
cada uno con una macro. Si pincho en el botón 1 la macro lo que hace es
mostrar de las hojas ocultas aquellas que relacionadas con el grupo 1. Si
pincho en el botón 2, me muestra de las hojas ocultas las relacionadas con
el
grupo 2... y así sucesivamente con todos los botones que tengo.

El problema es que lo que quiero es que si por ejemplo, pincho en botón 1
y
se muestran todas las hojas del grupo 1. Si ahora pincho en el botón 2
quiero
que se oculten todas las que no sean del grupo 2 y se muestren las del
grupo
2.

No consigo hacer una macro que diga "ocultar todas las hojas que están
visibles excepto la hoja Control Panel" (que es la primera, donde están
los
botones)... ya que cada hoja tiene nombres distintos y cada vez que pincho
en
un botón de antemano no sé cómo se van a llamar las hojas que están
mostradas
y quiero ocultar.

¿Me explico?

Pues eso, muchísimas gracias a todos por vuestra ayuda,
Martape
Respuesta Responder a este mensaje
#9 Héctor Miguel
03/09/2007 - 02:43 | Informe spam
hola, Marta !

... algo no va bien, te cuento:
1) Cambie el nombre al boton 1, por All, y al 7, por Nrds.
2) En un modulo estandard pegue todas las lineas de codigo de tu mail.
3) A cada uno de los 7 botones le asigne la macro "Grupo_x".
... pincho en cualquiera de los botones y me sale un error... que dice: Run-time error 9: Subscript out of range.
Doy a Debug y veo que aparece en amarilla la siguiente linea (dentro de la parte de Private Sub Oculta_todas():
Worksheets(nHojas(hX) & "_" & Gpo(gX)).Visible = sxSeetVeryHidden



1) transcribiste equivocadamente la propiedad *Visible* [no se si solo en este mensaje o tambien al *pegar* a tu modulo]
-> NO es: sxSeetVeryHidden
sino -> xlSheetVeryHidden

No se si te ayudare saber dos cosas, ademas: - El Excel lo tengo en ingles.
- Creo que no afecta en absoluto a tu idea ni nada, pero por si acaso, como detalle, la hoja donde tengo los 7 botones
que nunca debe ocultarse sino estar siempre visible, se llama Control_panel.



2) por otra parte, un error *9: subindice fuera del intervalo* [o en ingles: subscript our of range]...

a) significa que el codigo esta haciendo referencia [por nombre o posicion] a un objeto que no puede encontrar

b) el codigo de la propuesta esta *construyendo* LOS NOMBRES de las hojas por medio de *variables*

la primera parte de los nombres la toma de la constante:
Public Const Hojas As String = "totals,summary,averages,sickness rate"





a la cual agrega un *sufijo* formado por un guion bajo y las regiones [o grupos] que toma de la constante:
Public Const Grupos As String = "all,uk,de,fr,es,nl,nrds"





c) es mas seguro que probable, que alguna/s de dichas hojas NO *cumplen* con el patron esperado por ambas constantes:
Totals, Summary, Averages, Sickness Rate
[todas] con el *sufijo* de un quin bajo y las *regiones* {All/UK/DE/FR/ES/NL/Nrds}

revisa este *detallito* y, si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ las consultas anteriores __
1) con los siguientes *entendidos*:
a) 7 botones de la barra de herramientas formularios [NO cuadro de controles]
b) 7 grupos [uno por cada boton]: "All Markets", "UK", "DE", "FR", "ES", "NL" y "Nordics"
OJO: *presumo* que el anterior es el *titulo/nombre/Caption/...* escrito en cada boton ??? <= OJO
c) cada grupo con 4 hojas de nombre *generico*: "Summary_", "Totals_", "Averages_", Sickness Rate_"

2) haces las siguientes modificaciones:
a) los *Caption* [o titulo] de los botones 1 y 7 los cambias a 1="All" 7="Nrds" [para que coincidan con el *sufijo* de las hojas]
b) A TODOS los botones les asignas LA MISMA macro que en este ejemplo se llama: -> "Grupo_x()"
c) *el resto*... lo hacemos en el codigo [p.e.]
1) se ocultan todas las hojas excepto [obviamente] las que esten *fuera* de las constantes "Hojas" y "Grupos"
2) se muestran solo las hojas del boton *pinchado*
3) [adicionalmente] las hojas ocultas NO se muestran en el menu: formato / hoja / mostrar... :))
4) las ultimas lineas: -> #If Not VBA6 ... #End If son [y por si las dudas] solo aplicables cuando tu libro se ejecute en xl-97

3) copia/pega las siguientes lineas en un modulo de codigo normal/general/estandar/...
EN SUSTITUCION de todos los codigos que tenias asociados a cada boton y/o procedimiento para des/re/ocultar hojas <= OJO
y... cuando quieras/necesites ampliar/reducir los grupos y/o las hojas, solo revisa las constantes: "Hojas" y "Grupos" ;)

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Public Const Hojas As String = "totals,summary,averages,sickness rate"
Public Const Grupos As String = "all,uk,de,fr,es,nl,nrds"
Dim gX As Byte, Gpo, hX As Byte, nHojas
Sub Grupo_x()
Application.ScreenUpdating = False
Oculta_todas
nHojas = Split(Hojas, ",")
For hX = LBound(nHojas) To UBound(nHojas)
Worksheets(nHojas(hX) & "_" & _
ActiveSheet.Buttons(Application.Caller).Caption).Visible = True
Next
End Sub
Private Sub Oculta_todas()
Gpo = Split(Grupos, ",")
nHojas = Split(Hojas, ",")
For gX = LBound(Gpo) To UBound(Gpo)
For hX = LBound(nHojas) To UBound(nHojas)
Worksheets(nHojas(hX) & "_" & Gpo(gX)).Visible = xlSheetVeryHidden
Next
Next
End Sub
#If Not VBA6 Then
Function Split(Cadena As String, Delimitador As String) As Variant
Split = Evaluate("{""" & Application.Substitute(Cadena, Delimitador, """,""") & """}")
End Function
#End If

__ la consulta original __
> La opcion 1 me encantaria, pero... como se hace una macro que oculte todas las hojas que estan visibles?
> Como cada una tiene su nombre... seria lo ideal, se ejecuta y oculta todas las hojas que hay visibles [...]

> Opcion 2: te comento detalles:
> - Los botones son... desde la barra de herramientas de formulario, y a cada uno le he asignado una macro.
> - Tengo en total 7 grupos, cada uno de ellos tiene asociadas 4 hojas. Te pongo la estructura:
> Grupo 1: se llama "All Markets" y las hojas asociadas se llaman: "Summary_All", "Totals_All", "Averages_All", "Sickness Rate_All"
> Grupo 2: se llama "UK" y las hojas asociadas se llaman: "Summary_UK", "Totals_UK", "Averages_UK", "Sickness Rate_UK"
> Grupo 3: se llama "DE" y las hojas asociadas se llaman: "Summary_DE", "Totals_DE", "Averages_DE", "Sickness Rate_DE"
> Grupo 4: se llama "FR" y las hojas asociadas se llaman: "Summary_FR", "Totals_FR", "Averages_FR", "Sickness Rate_FR"
> Grupo 5: se llama "ES" y las hojas asociadas se llaman: "Summary_ES", "Totals_ES", "Averages_ES", "Sickness Rate_ES"
> Grupo 6: se llama "NL" y las hojas asociadas se llaman: "Summary_NL", "Totals_NL", "Averages_NL", "Sickness Rate_NL"
> Grupo 7: se llama "Nordics" y las hojas asociadas se llaman: "Summary_Nrds", "Totals_Nrds", "Averages_Nrds", "Sickness Rate_Nrds"
>
> - El codigo que se ejecuta al pinchar cada boton es muy simple.
> Si pincho en el de UK, la macro lo que hace es hacer visibles las cuatro pesta#as de UK. [...]
Respuesta Responder a este mensaje
#10 Héctor Miguel
03/09/2007 - 02:58 | Informe spam
hola, Marta !

Te cuento avances: en el codigo elimine directamente la linea que aparecia en amarillo
... sospecho que esa linea es la que hace que las hojas ocultas NO se muestran en el menu: formato / hoja / mostrar...
Realmente esto no me hace falta...



ok, estoy de acuerdo en que no haga falta que no te aparezcan en el menu de formato/hoja/mostrar
pero es tambian la linea que se encarga de ocultar las hojas, por eso es que al eliminarla...

... ahora al pinchar en cualquier boton, se hacen visibles las 4 hojas correspondientes a ese grupo.
El problema es que no se ocultan las demas, y necesitaria que se ocultaran.



revisa los comentarios en tu mensaje anterior [es probable que encuentres alguna hoja *discordante* con el patron de nombres]

... si aun estamos a tiempo... me gustaria que despues de... aparecer sus 4 pesta#as
... quedar el cursor en la... pesta#a "Summary_x" del grupo que corresponda... en la celda A1.



Sub Grupo_x()
Application.ScreenUpdating = False
Oculta_todas
nHojas = Split(Hojas, ",")
For hX = LBound(nHojas) To UBound(nHojas)
Worksheets(nHojas(hX) & "_" & _
ActiveSheet.Buttons(Application.Caller).Caption).Visible = True
Next
Worksheets("summary_" & ActiveSheet.Buttons(Application.Caller).Caption).Activate
Range("a1").Select
End Sub

saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida