Page 1 of 1

Timer congelado

Posted: Thu Nov 27, 2014 5:30 pm
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

Re: Timer congelado

Posted: Thu Nov 27, 2014 5:49 pm
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.

Re: Timer congelado

Posted: Thu Nov 27, 2014 5:57 pm
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()

Re: Timer congelado

Posted: Thu Nov 27, 2014 6:20 pm
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.

Re: Timer congelado

Posted: Thu Nov 27, 2014 6:32 pm
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

Re: Timer congelado

Posted: Thu Nov 27, 2014 6:51 pm
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 ...

Re: Timer congelado

Posted: Thu Nov 27, 2014 7:03 pm
by hmpaquito
Genial Sebastián, ¡ qué bien haberte podido ayudar !

Re: Timer congelado

Posted: Thu Nov 27, 2014 8:54 pm
by Antonio Linares
menudo equipazo ;-)