Automatización de Excel, error cuando el usuario decide no guardar la hoja de cálculo

643 views
Skip to first unread message

Elides Paredes

unread,
Apr 15, 2016, 10:39:13 AM4/15/16
to Comunidad de Visual Foxpro en Español
Estimados amigos.

El siguiente texto lo tomé de una consulta hecha por Julio Cesar Vente Ruiz en Marzo del 2012

Tengo exactamente el mismo problema. El amigo Julio expuso lo siguiente:

"En una rutina envío datos a excel y luego necesito grabar los datos, pero el usuario puede elegir previamente como se llamar el archivo lo cual capturo con VARCHIVO = PUTFILE("Archivo MS Excel","","xls"). 
Resulta que si el usuario selecciona un archivo que ya existe el SaveAs de Excel pregunta que si desea remplazarlo, a lo cual si el usuario selecciona que si, no hay problema se remplaza el archivo, pero si selecciona que NO, me genera un error La instruccion del SaveAs que uso es la siguiente: Excel1.Application.ActiveWorkbook.SaveAs(VARCHIVO, -4143, "", "", .F., .F.) 
Y el error que me genera si el usuario decide no remplazar el archivo es : Código de excepción OLE IDispatch 0 de Microsoft Excel: No se puede obtener la propiedad SaveAs de la clase Workbook.. "

La respuesta final de Luis Maria Guayan fue 
"Tu debes tener una condición que si existe y contesta SI, ejecutas SaveAs, si existe y contesta NO, no ejecutas el SaveAs"

El problema que tengo, la razón de mi consulta es: ¿cómo hacer lo que dice el Maestro?, el error lo genera Excel no VFP. o ¿hay otra solución diferente? He buscado durante 3 dias respuestas antes de consultar el foro. Y en ninguna encuentro la solución. He visto muchas personas con el mismo problema, pero a ninguno le dieron una solución. (o, ¿no he aprendido a buscar?)

 Otra cosa que me gustaría es que no me cree una hoja en blanco (de excel, tengo que cerrar 2 archivos de excel, el que creo con algoritmos y el que se crea en blanco (supongo que yo también, pero no se como lo hago, jajaja)

ah..! y 
XLApp.DisplayAlerts = .F. && Esta Instrucción no funciona bien, (o seguramente no la comprendo) no indica que hay un Archivo guardado con el mismo nombre


Antes que nada, muchas gracias por su ayuda.

Saludos de 

Elides Paredes
Barquisimeto Venezuela

Jose Antonio Blasco

unread,
Apr 15, 2016, 11:16:28 AM4/15/16
to Comunidad de Visual Foxpro en Español
Elides, si a la pregunta de reemplazo contestan NO, la instrucción VARCHIVO = PUTFILE("Archivo MS Excel","","xls") devolverá la cadena vacía, que es lo que debes controlar para no ir al "SaveAs".

Un saludo.


Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2

"No hay camino hacia la libertad, la libertad es el camino" - Indira Gandhi
“Nunca te olvides de sonreír, porque el día que no sonrías  será un día perdido”  -  Charles Chaplin
“Todo el mundo quiere tener un amigo, pero pocos se toman la molestia de ser uno”
- Anónimo

Elides Paredes

unread,
Apr 15, 2016, 11:47:18 AM4/15/16
to Comunidad de Visual Foxpro en Español

Estimado amigo José Blasco.

Antes que nada, muchas gracias por tu ayuda.

El problema es que cuando intenta guardar los cambios está en Excel, Podría hacerlo antes de crear el archivo de Excel, ver si existe y no crearlo. 

Pero, debo volver a ver ese archivo antes de enviarlo por correo. Por eso, ya está en memoria cargado y abierto el Excel, la pregunta si deseo sobre escribir está en excel, y es como las chicas, no permite que le digan que no desea guardar.. jajaja..
Adjunto imagen.

Entiendo que si verifico que existe el archivo y no deseo volverlo a crear pues, no crea el archivo y no abre Excel, sin embargo el error me lo da cuando hago: (ver imagen adjuta)

XLSheet = XLApp.ActiveSheet.SaveAs (archivo_excel,45,,,.F.)

De nuevo, gracias.  !

Saludos de 

Elides Paredes

Barquisimeto Venezuela

Jose Antonio Blasco

unread,
Apr 15, 2016, 11:54:21 AM4/15/16
to Comunidad de Visual Foxpro en Español
Ya entiendo, entonces tiene razón Luis María, como siempre, jejeje
Antes de la instrucción "XLSheet = XLApp.ActiveSheet.SaveAs (archivo_excel,45,,,.F.)" debes comprobar si el "archivo_excel" ya existe, y hacer tú la pregunta de reemplazar, para tener el control.

Espero haberte entendido bien.



Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2

"No hay camino hacia la libertad, la libertad es el camino" - Indira Gandhi
“Nunca te olvides de sonreír, porque el día que no sonrías  será un día perdido”  -  Charles Chaplin
“Todo el mundo quiere tener un amigo, pero pocos se toman la molestia de ser uno”
- Anónimo

Elides Paredes

unread,
Apr 15, 2016, 12:06:45 PM4/15/16
to Comunidad de Visual Foxpro en Español
He ahí el problema

Si lo hago de esa forma, no entro a Excel y no veo el archivo. Como dije antes mi amigo. Esa era la solución de Luis María, pero igual no se como implementarla.

Sigo con la duda, porque cuando VFP ejecuta la instrucción de guardar como ya viene la respuesta de Excel, si el usuario dijo sí, reemplazar. No hay problema, VFP guarda como, (Con el nombre designado), pero si le digo que no desde excel, viene con un NO guardar y VFP da el error.
Bueno, esa es mi interpretación de porque no me funciona, quizás lo hago mal, la verdad no lo sé, pero ¿Qué hago? no encuentro la forma. E insisto, no he podido encontrar la solución, quizás a otros les ha sucedido lo mismo. (deciden dejarla para luego)

Si estoy enfocando mal algo, o estoy en algún error, por favor dímelo.

Gracias por tu paciencia.. 
 

Elides Paredes
Barquisimeto Venezuela

Víctor Hugo Espínola Domínguez

unread,
Apr 15, 2016, 12:58:54 PM4/15/16
to publice...@googlegroups.com
Mira si te sirve esto:

lcArchXls = Putfile("", "", "xls;xlsx")
If Not Empty(m.lcArchXls)
If File(m.lcArchXls)
Delete File (m.lcArchXls)

* o crear una copia de la planilla existente

* lcArchXlsBU = Juststem(m.lcArchXls) + "_" + Sys(2015) + "." + Justext(m.lcArchXls)
* lcArchXlsBU = Addbs(Justpath(m.lcArchXls)) + m.lcArchXlsBU
* Rename (m.lcArchXls) To (m.lcArchXlsBU)

Endif
m.loExcel.ActiveWorkBook.SaveAs(m.lcArchXls)
Endif


Saludos,
Víctor.
Lambaré - Paraguay.

Elides Paredes

unread,
Apr 15, 2016, 1:34:05 PM4/15/16
to Comunidad de Visual Foxpro en Español
Amigo Víctor...
 
Usted es lo máximo y lo que mas me impresiona es que dices modestamente Mira si te sirve...
Lo que haces siempre sirve... Muchas gracias..
Solo tomé 2 líneas, porque yo no selecciono un nombre de archivo, lo creo a partir, en éste caso,  del número del Número de transacción.

archivo_excel = "C:\proyecto\excel\"+"Transaccion-" +;
          ALLTRIM(str(Thisform.num_Transa1.Value))+" "+;
          ALLTRIM(Thisform.Proveedor1.Value)+".XLSX"

Entonces la solución ideal es esa, jamás se me hubiese ocurrido y no se porque, Si existe el archivo, antes de guardarlo con saveas, lo borro.. Genial..!! Espero que le sirva a otros.

No obstante, amigo José igualmente muy agradecido. Me quedó así

IF File(m.archivo_excel)
Delete File (m.archivo_excel)
ENDIF
XLSheet = XLApp.ActiveSheet.SaveAs (archivo_excel,45,,,.F.)

Ustedes son mas efectivos que el acetaminofen y el ácido acetilsalicílico, para quitar los dolores de cabeza, 

Víctor Hugo Espínola Domínguez

unread,
Apr 15, 2016, 1:43:43 PM4/15/16
to publice...@googlegroups.com
👍

Saludos,
Víctor.
Lambaré - Paraguay.


Reply all
Reply to author
Forward
0 new messages