Timer congelado

Post Reply
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Timer congelado

Post by Sebastián Almirón »

Hola a todos, a ver si alguien me puede echar una mano:

¿ Como puedo averiguar si un libro excel tiene password de apertura sin abrirlo ?

Tengo un proceso que ejecuto los fines de semana por ser muy largo, que consiste en abrir muchos libros excel (más de 30.000) para extraer unos datos y pasarlos a una dbf.

El caso es que algunos libros tienen contraseña (que no debo conocer) para poder abrirlo (la contraseña de apertura, no la de protección de las hojas) y cuando intento abrirlo mi programa se queda esperando a que al objeto Excel se le indique la contraseña o se cancele, algo así:

oexcel := CreateObject( "Excel.Application" )
oexcel:DisplayAlerts(.F.)
...
olibro := oexcel:WorkBooks:Open(alltrim(fichero),.f.,.f.)

...
Y cuando el libro tiene contraseña, el programa NO continúa despues del workbooks:open. Lo que quiero conseguir es que en caso de tener contraseña se salte ese libro, pero que en cualquier caso no se interrumpa el proceso.

He probado de todo, e incluso con un timer y no entiendo porqué no funciona:
...
osigo := .f.
DEFINE TIMER oTimerbook INTERVAL 6000 ACTION isopenxls() OF oWnd
ACTIVATE TIMER oTimerbook

osigo := oexcel:WorkBooks:Open(alltrim(fichero),.f.)


oTimerbook:end()
...

function isopenxls()
dbg('osigo = ' + valtype(osigo))
return

Se supone que el timer me debería indicar 'L' pasados unos segundos, pero el caso es que cuando Excel está pidiendo la contraseña, no se ejecuta la función ispoenxls(). Si cambio la linea workbooks:open por un msgalert(), si funciona aunque no salga del msgalert(). ???

En excel existe :haspassword para averiguar si tiene o no password, pero claro primero hay que abrir el libro.

¿Alguna idea ?
Saludos
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Timer congelado

Post by hmpaquito »

Me imagino que el timer no funciona porque tu programa no esta pasando por el bucle de eventos y no esta pasando por el bucle de eventos porque la ejecucion esta parada en la hoja excel.

Si no encuentras otra solucion mejor, como por ejemplo saber a priori si una excel tiene clave yo, en plan salvaje lo plantearia asi:

Haces un pequeño .exe, que se llame nicolas.exe que sea el que realmente importe cada excel. Desde el programa principal haces una llamada al pequeño nicolas.exe por cada hoja excel... La llamada la haces con WinExec() y haciendo un sleep(3) entre llamada y llamada.
De esta forma si una hoja tiene constraseña, se parara esa instancia de programa, pero el resto continuara.

Espero haberme explicado.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Timer congelado

Post by Antonio Linares »

Sebastian,

Si con un MsgAlert() te funciona, entonces prueba con un SysRefresh(), porque MsgAlert() usa el bucle de eventos de Windows y hace el mismo efecto que un SysRefresh()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: Timer congelado

Post by Sebastián Almirón »

Gracias hmpaquito,

Ya lo había pensado, pero son muchos ficheros y el tiempo límite es el fin de semana... :?

Actualmente solo con abrir cada fichero, extraer los datos y cerrarlo, usando el mismo objeto excel ( reiniciandolo cada 200 ficheros, porque tengo constancia que tarda menos) el proceso tarda unas 50 horas. Si para cada fichero tuviera que crear un nuevo objeto Excel los tiempos se disparan, no digamos ya si tengo que llamar al programa nicolas.exe y dentro de el crear el objeto excel por cada fichero.

Tengo que buscar otra solución


Antonio,

cuando digo que con msgalert() funciona es sustituyendo workbooks:open() por msgalert(). El problema lo tengo en el momento que pongo el workbooks:open(), es lo que deja congelado mi programa hasta que se ponga la contraseña o se cancele.
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Timer congelado

Post by hmpaquito »

Sebastian,

Comprendo... la cosa es algo mas dificil...

Segun la web que te pego debajo, parece que se puede detectar si una excel tiene password... parece que al metodo open hay que pasarle algun parametro... solo lo he visto por encima... a ver si te vale https://social.msdn.microsoft.com/Forum ... rum=isvvba

Saludos
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: Timer congelado

Post by Sebastián Almirón »

Gracias hmpaquito, ahí le as dao. ME FUNCIONA:

try
osigo := oexcel:WorkBooks:Open(alltrim(fichero),0,.t.,1,"","")
catch
osigo := .f.
end

if valtype(osigo) = 'O'
Msgalert('No tiene password')
else
Msgalert('Tiene password')
endif

Mil gracias ...
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Timer congelado

Post by hmpaquito »

Genial Sebastián, ¡ qué bien haberte podido ayudar !
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Timer congelado

Post by Antonio Linares »

menudo equipazo ;-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply