Seguridad

14/06/2005 - 00:58 por diegoar | Informe spam
buenas, para el que me pueda ayudar
necesito lo siguiente, tengo una aplicacion en vba en donde necesito
que cada vez que salga del form principal (que cierra el archivo excel)
antes de salir me queden las hojas ocultas y protegidas, y cuando
ejecute la aplicacion, (es decir cuando aparezca el form principal),
las hojas se desprotejan y se muestren. como lo puedo implememtar??

saludos

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
14/06/2005 - 02:29 | Informe spam
hola, diego !

... que cada vez que salga del form principal... queden las hojas ocultas y protegidas
... cuando ejecute la aplicacion, (... aparezca el form principal), las hojas se desprotejan y se muestren



[creo que] esta consulta es como una 'punta de iceberg' [por debajo existen... -una serie de imponderables-] :))
te paso algunas alternativas y ejemplos [con algunos de sus pros y contras] al final del presente
si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.

op1: mantener oculta ->la ventana<- del libro [y con ello -todas- sus hojas] hasta que se ejecute el form...
en el modulo de codigo del libro [ThisWorkbook] ==Dim Clave As String
Private Sub Workbook_Open()
Clave = "tumbaloflesicodelicomicoso" '<= pon aqui una clave 'dificil'
Me.Unprotect Clave
Windows(Me.Name).Visible = True
UserForm1.Show
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Windows(Me.Name).Visible = False
Me.Protect Clave, True, True
Me.Save: Me.Close
End Sub
=> pros: [creo que 'sobra' mencionarlos] :))
cons: si el libro se abre SIN 'permiso' de usar las macros... el usuario 'tendra que' CERRAR excel y comenzar 'de 0' :-(

op2: ocultando/mostrando -solo- algunas hojas del libro...
-> como 'paso #1' [te sugiero]... 'llamar' al codigo que oculta las hojas en el evento '_beforsave'
[de esta manera, la 'grabacion' del archivo mantendra ocultas 'esas' hojas ->siempre<-] ;)
-> como 'paso #2'... usar una variable que 'le indique' a excel 'cuando se inicia' el proceso de 'cierre'
[mientras el archivo 'permanezca' abierto... 'llamas' a OTRA macro que 'vuelva' a presentar las hojas]
-> como 'paso #3'... 'mantener' en una matriz los nombres de dichas hojas [la puedes modificar a voluntad]
-> ANTES de que 'intentes' guardar/cerrar el archivo [una vez 'copiados' los codigos]...
=>'ejecuta' el evento '_open'<= [en el editor de vba] -> 'parate' en el evento -> pulsa {F5} ;)
espero que la 'secuencia' y la 'logica' del codigo siguiente sea... 'secuencialmente logica' :DD
[probablemente] habra 'cosas' que te interese 'conservar' [entre ocultar/mostrar hojas] como...
¿conservar la hoja 'donde estaba' el usuario?... 'pero'... ya 'comentaras' las modificaciones que 'faltan' ;)
en el modulo de codigo del libro [ThisWorkbook] ==Private Ocultas, Cerrando As Boolean
Private Sub Workbook_Open()
Definir_Ocultas
Mostrar_Ocultas True
UserForm1.Show
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cerrando = True
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.EnableEvents = False
Mostrar_Ocultas xlSheetVeryHidden
If Not Cerrando Then Mostrar_Ocultas True
Cancel = Not Cerrando
Application.EnableEvents = True
End Sub
Private Sub Definir_Ocultas()
Ocultas = Array("Hoja2", "Hoja3", "Hoja4")
End Sub
Private Sub Mostrar_Ocultas(ByVal Mostrar)
Application.ScreenUpdating = False
Dim Sig As Integer
For Sig = LBound(Ocultas) To UBound(Ocultas)
Worksheets(Ocultas(Sig)).Visible = Mostrar
Next
If Mostrar = xlSheetVeryHidden Then Me.Save
If Mostrar = True Then Me.Saved = True
End Sub
=> pros: [creo que 'sobra' mencionarlos] :))
cons: podria haber 'fallos' si el usuario le cambia de nombre a las hojas [entre otros] :-(

op3: [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) estabece a las hojas la propiedad .Visible = xlSheetVeryHidden [en lugar de la 'simple' False]
b) si usas la propiedad 'indice' ->Worksheets(1)<- [pero 'igual' pudiera ser si usas el nombre]...
-> 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] ;)
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
en el modulo de codigo del libro [ThisWorkbook] ==Dim Cerrando As Boolean, Activa As String
Private Sub Workbook_Open()
MostrarHojas
UserForm1.Show
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

[sigo creyendo que] cuando hablamos de algun 'sistema de proteccion'...
[ya iras 'viendo' que...] se encuentran mas 'imponderables' que los intentos de 'prevenirlos' :(
=>TENDRAS QUE aplicar una clave de proteccion [tambien] al proyecto de macros <= OJO
[si tus necesidades 'van mas alla'... visita: http://www.sistemaslym.net/vba/excel/exarc1.html]
Respuesta Responder a este mensaje
#2 diegoar
14/06/2005 - 12:59 | Informe spam
hector, utilice la opc 1 y anduvo perfecto. Ahora lo unico que
agregaria es esto: Si yo pongo no habilitar macros, lleando a ventana
==Mostrar, me muestra todas las hojas. Como puedo hacer una sentecnia
para que se desahabilite la opcion de la barra Ventana. Estuve
chusmeando en tu pagina, pero encontre un pedazo de codigo que me tira
error.
Respuesta Responder a este mensaje
#3 Héctor Miguel
14/06/2005 - 19:54 | Informe spam
hola, diego !

... la opc 1... lo unico que agregaria es esto:
Si yo pongo no habilitar macros, llendo a ventana ==Mostrar, me muestra todas las hojas
... hacer una sentecnia para que se desahabilite la opcion de la barra Ventana [...]



disculpame... un 'error por omision' [mio... 'para variar'] :D
-> la primera vez que el libro se guarda [recien 'escritos' los codigos 'propuestos'] por el evento '_beforeclose'...
a) la variable para establecer la clave... NO ha sido 'inicializada' NI 'asignada' ;)
[por lo tanto, el libro NO tiene clave de proteccion y la ventana -tambien- esta 'desprotegida'] :-((
b) puedes 'forzar' la entrada 'en vigor' de la clave [y su subsecuente proteccion] si...
[en el editor de vba] seleccionas el evento '_open' del libro y pulsas la tecla {F5} ;)
o... te esperas hasta la segunda ocasion en que el libro utilice el evento '_beforeclose' :-\
-> la/s siguiente/s ocasion/es en que el libro NO tenga 'permiso' de usar las macros...
el comando 'mostrar' [del menu ventana] va a solicitar 'la clave' [con la que se cierra en el evento '_beforeclose'] ;)
[solo te recuerdo que hay varias 'trampas' por la red para 'desproteger' libros y hojas de excel] :-((

si cualquier duda... comentas?
saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida