hola, Esteban !
... lo habia pensado, pero no me gusta. Si... pudieramos eliinmar la opcion de Cancelar podria ser
... pero no quiero eliminar la opcion de cerrar sin guardar.
-> ya que estas 'forzando' al usuario para que habilite las macros :DD
[todavia] existen algunos 'riesgos' para que 'eche por la borda' la proteccion de las hojas 'ocultas' [p.e.]
-> si NO da 'su permiso' para que se haga uso de las macros [o sea que de todos modos 'lo abre']...
a) podria mostrar las hojas ocultas desde [menu] formato / hoja / mostrar...
=> estabece a las hojas la propiedad .Visible = xlSheetVeryHidden [en lugar de la 'simple' False]
b) estas usando la propiedad 'indice' ->Worksheets(1)<- [pero 'igual' pudiera ser si usas el nombre]...
[y no estoy seguro de que se trate de -solamente- las tres hojas que pones en el ejemplo, pero...]
-> si les cambia el nombre o la 'posicion'... YA NO 'van a ser'... las que tu 'suponias' :-( <= OJO
=> [te sugiero] CAMBIALES y usa la propiedad 'CodeName' [la que esta entre parentesis en las propiedades]
c) suponiendo que habilita las macros... si graba el archivo cuando estan visibles las hojas 'ocultables'...
y sin hacer mas modificaciones... CIERRA el archivo... 'la proxima vez' [que lo abra]... van a seguir visibles :-(
[ya sabes... le diceque no al 'famoso cuadrito' de... desea guardar los cambios.......]
d) aunque puedes 'monitorear' la advertencia [esa la del cuadrito] a traves del evento '_beforeclose' de thisworkbook...
lo realmente 'importante' [creo yo] y que es necesario 'proteger'... es el evento ->_beforesave<-
[para que siempre que se grabe el archivo, las hojas 'ocultables' permanezcan ocultas] ;)
te paso un ejemplo usando 3 hojas, los eventos, las propiedades y los codenames mencionados
[adapta segun tus necesidades] estoy usando los siguientes codenames:
pantalla = es el codename de la hoja que se mostrara cuando el libro se abre SIN permiso de usar macros
presentar = es el codename de la hoja que se muestra al habilitar las macros [la que no queda como 'activa']
procesos = es el codename de la hoja que queda como 'activa' al abrirse 'con permiso' de usar macros
si cualquier duda... comentas?
saludos,
hector.
=== en el modulo de codigo del libro [ThisWorkbook] ===
Dim Cerrando As Boolean, Activa As String
Private Sub Workbook_Open()
MostrarHojas
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' http://j-walk.com/ss/excel/tips/tip78.htm
If Not Me.Saved Then
Select Case MsgBox( _
"¿Desea guardar los cambios efectuados en '" & _
Me.Name & "'?", vbYesNoCancel + vbQuestion)
Case vbYes: OcultarHojas: Cerrando = True: Me.Save
Case vbNo: Me.Saved = True
Case vbCancel: Cancel = True: Exit Sub
End Select
End If
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Cerrando Then Exit Sub
Application.ScreenUpdating = False
Activa = ActiveSheet.Name
OcultarHojas
Me.Save
MostrarHojas
Sheets(Activa).Activate
Cancel = True
End Sub
Private Sub MostrarHojas()
Procesos.Visible = xlSheetVisible
Pantalla.Visible = xlSheetVeryHidden
Presentar.Visible = xlSheetVisible
Me.Saved = True
End Sub
Private Sub OcultarHojas()
Pantalla.Visible = xlSheetVisible
Presentar.Visible = xlSheetVeryHidden
Procesos.Visible = xlSheetVeryHidden
End Sub