[RESUELTO]Problema con macro para proteger, guardar y cerrar

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Avatar de Usuario
MartyMcfly
Mensajes: 26
Registrado: Sab Mar 03, 2018 12:20 pm

[RESUELTO]Problema con macro para proteger, guardar y cerrar

Mensaje 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
Captura1.PNG (6.55 KiB) Visto 5410 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.
Última edición por MartyMcfly el Dom Abr 01, 2018 3:39 pm, editado 1 vez en total.
Gracias, saludos
Ariel
OpenOffice 4.1.5 - LibreOffice 6.0.2.1 en Microsoft Windows 10 Pro
Avatar de Usuario
MartyMcfly
Mensajes: 26
Registrado: Sab Mar 03, 2018 12:20 pm

Re: Problema con macro para proteger, guardar y cerrar

Mensaje 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.
Gracias, saludos
Ariel
OpenOffice 4.1.5 - LibreOffice 6.0.2.1 en Microsoft Windows 10 Pro
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: Problema con macro para proteger, guardar y cerrar

Mensaje 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.
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
Avatar de Usuario
MartyMcfly
Mensajes: 26
Registrado: Sab Mar 03, 2018 12:20 pm

Re: Problema con macro para proteger, guardar y cerrar

Mensaje 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
Gracias, saludos
Ariel
OpenOffice 4.1.5 - LibreOffice 6.0.2.1 en Microsoft Windows 10 Pro
Avatar de Usuario
MartyMcfly
Mensajes: 26
Registrado: Sab Mar 03, 2018 12:20 pm

Re: [RESUELTO]Problema con macro para proteger, guardar y ce

Mensaje 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??
Gracias, saludos
Ariel
OpenOffice 4.1.5 - LibreOffice 6.0.2.1 en Microsoft Windows 10 Pro
Responder