Página 1 de 1
[RESUELTO]Problema con macro para proteger, guardar y cerrar
Publicado: Vie Mar 30, 2018 7:12 pm
por MartyMcfly
Como estas, buenas a todos
Tengo un temita con una macro que estoy agregandole a un Libro, la misma, asignada al suceso "Se cerrará el documento", al cerrar el Libro o la aplicacion "debería" proteger con contraseña las Hojas (No el Libro), guardar los cambios y cerrar.
Si bien lo requerido me lo realiza, al cierre, tira error fatal, tanto en OpenOficce y lo mismo en LibreOffice (imagen adjunta) y se cierran todos los Libros abiertos.

- Captura1.PNG (6.55 KiB) Visto 5940 veces
Adjunto el código:
Código: Seleccionar todo
Const Clave = "12345"
Sub ProtegerAutomaticamente
dim oDoc as object, x as object
oDoc = StarDesktop.CurrentComponent
if oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
for each x in ThisComponent.Sheets()
x.Protect( clave )
next
msgbox "Se protegieron exitosamente todas las Hojas", 48, "Aviso de seguridad"
oDoc.store()
wait 500 'le da 1 segundo para dar tiempo a guardar los cambios
oDoc.Close(TRUE)
end if
end sub
Si me dan una mano se los voy a agradecer.
Re: Problema con macro para proteger, guardar y cerrar
Publicado: Sab Mar 31, 2018 2:30 am
por MartyMcfly
Aporto algun dato más:
Estuve probando el código al final de una macro y funciona perfecto, la macro dónde probé desprotege las Hojas y luego de 20 segundos llama a la macro citada en el código del anterior mensaje, protege, guarda y cierra sin error alguno.
No se porque al asignarla a un evento me da ese error, también cambié StarDesktop.CurrentComponent por ThisComponent.CurrentController.Frame y sale el mismo error.
Lo que también estuve intentando es lo que mencionaba más arriba, que despues de desproteger las hojas el usuario tenga 20 segundos para realizar las modificaciones y luego la macro proteja, guarde y cierre, pero si tarda menos y cierra el usuario la hoja se va a guardar sin o con los cambios pero desprotegida. Estuve buscado alguna instrucción para cerrar por inactividad pero no encontre nada.
Re: Problema con macro para proteger, guardar y cerrar
Publicado: Dom Abr 01, 2018 7:07 am
por PepeOooSevilla
Hola.
He hecho esta pequeña modificación:
Código: Seleccionar todo
Option Explicit
Const Clave = "12345"
Sub ProtegerAutomaticamente
dim oDoc as object, x as object
'(1) oDoc = StarDesktop.CurrentComponent
oDoc = ThisComponent
if oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
'(2) for each x in ThisComponent.Sheets()
for each x in oDoc.Sheets()
x.Protect( clave )
next
msgbox "Se protegieron exitosamente todas las Hojas", 48, "Aviso de seguridad"
oDoc.store()
'wait 500 'le da 1 segundo para dar tiempo a guardar los cambios
'(3) oDoc.Close(TRUE) No es necesario decirle que lo cierre porque ya lo está cerrando
end if
end sub
He asignado la macro al suceso
Se cerrará el documento y, al cerrar el documento Calc, protege todas las hojas y guarda los cambios.
Saludos cordiales.
Re: Problema con macro para proteger, guardar y cerrar
Publicado: Dom Abr 01, 2018 3:38 pm
por MartyMcfly
Gracias Pepe por la respuesta.
Ayer agarré el libro de Mauricio y me puse a revisar un poco, cambié algunas cosas que se adecuan a mi necesidad. Hice lo mismo que me comentas, si el usuario cierra la Aplicación o el Libro, antes de cerrar se protege y da la opcion de guardar o no los cambios, pero por más que no se guarden queda siempre protegido, el tema era ese que no se guarde sin protección.
Tambien asigne un código al inicio del Libro el cual, luego de 8 segundos de no haber hecho modificaciones, protege todas las Hojas y cierra el libro (ahí no me dio problemas el oDoc.close(true)), luego si realiza modificaciones le aparecera una ventana preguntando si necesita más tiempo para seguir editando y al aceptar dará 30 segundos más, y así hasta que seleccione "no", donde temina el bucle y Protege, guarda y cierra perfectamente el Libro sin errores. Todo un logro para un principiante como yo, igualmente comparto el código quizas a alguin le sirva, seguramente tiene muchas cosas para mejor así que bienvenidas las críticas constructiva.
Doy el tema como RESUELTO.
Código: Seleccionar todo
Const Clave = "1234"
Sub GuardaryProteger
dim oDoc as object, x as object
REM McFly ------------------------------------------------------------------------------
oDoc = ThisComponent
if oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
for each x in ThisComponent.Sheets()
x.Protect( clave )
next
msgbox "Se protegieron exitosamente todas las Hojas", 48, "Aviso de seguridad"
end if
end sub
sub Protegeraliniciar
dim oDoc as object, x as object
dim Confirmar as Integer
dim Confirmar2 as Integer
REM McFly ------------------------------------------------------------------------------
oDoc = ThisComponent
wait 6000
if oDoc.isModified()=false then
oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument")
for each x in ThisComponent.Sheets()
x.Protect( clave )
next
msgbox "Por inactividad se protegieron todas las Hojas", 48, "Aviso de seguridad"
msgbox "El documento se cerrará", 48, "Aviso de seguridad"
oDoc.close(true)
else
wait 20000 '20 segundos antes de iniciar
do
Confirmar = msgbox ("Ha pasado mucho tiempo, continuar editando??", 32 + 4, "Confirmar")
Select Case Confirmar
Case 6 'Si presiona SI
msgbox "Puedes continuar editando por 30 segundos más", 64, "Aviso"
wait 30000
Case 7 'Si presiona NO
wait 300
if oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") then 'Proteger Hojas
for each x in ThisComponent.Sheets()
x.Protect( clave )
next
msgbox "Se guardaron todas las modificaciones y" & chr(13) & "se protegieron exitosamente todas las Hojas", 48, "Aviso de seguridad"
oDoc.store() 'Guardar
wait 500 '0,5 segundos para que guarde
msgbox "El documento se cerrará", 48, "Aviso de seguridad"
oDoc.close(true)
else
msgbox "Sin modificaciones"
end if
end Select
loop while Confirmar = "6" 'termina el bucle si se preciona NO
exit sub
end if
end sub
Re: [RESUELTO]Problema con macro para proteger, guardar y ce
Publicado: Jue Abr 05, 2018 4:34 am
por MartyMcfly
Me surgio un tema al ejecutar el código del mensaje anterior.
Con el código en ejecución, con esos 30 segundos corriendo, si cierro el Libro me arroja un error, y esto lo entiendo porque la macro no puede comprobar que botón presione en el diálogo ni tampoco guardar los cambios, la pregunta es si hay manera de interrumpir el ciclo de la macro si se cierra el Libro o la aplicación??