Page 1 of 1
Excel en modo edición de celda
Posted: Wed Mar 09, 2011 5:13 pm
by Sebastián Almirón
Hola a todos.
Tengo un problema que me trae loco y no se como resolver:
Tengo una aplicación que abre libros excel y el usuario puede modificarlos. Es mi aplicación la que se encarga de guardarlos. Pero me ocurre que cuando el usuario está en modo edicción de una celda, las propiedades y los metodos del objeto excel no están disponibles:
oexcel := CreateObject('Excel.Application')
oexcel:WorkBooks:Open('C:\LibroA.xls')
oexcel:visible(.t.)
Si el usuario no está en modo edicción lo siguiente no da error:
oexcel:ActiveWorkBook:Save()
Sin embargo si está en modo edicción fivewin me muestra el error:
Error description: Error Excel.Application/1
Unknown error: ACTIVEWORKBOOK
Ya se que mientras el usuario está editando una celda no debería seleccionar en el menú de mi aplicación guardar el libro, pero los usuarios son como son y queda muy mal que el programa les tire un error y se cierre, encima sin haber guardado y luego salga toda la retaila de ventanas de enviar a microsoft y se abra excel con el libro que se quedó colgado.
He probado de todo, valtype(oexcel) devuelve 'O', pero valtype(oexcel:ActiveWorkBook) devuelve el mismo error si está en modo edición.
Si pudiera acceder a:
oexcel:CommandBars('Worksheet Menu Bar'):Controls('Archivo'):Controls('Nuevo...'):Enabled()
podría detectarlo, puesto que el menu de Archivo->Nuevo se deshabilita cuando entras en modo edicción, pero como ya he dicho cualquier llamada al objeto excel emite un error. Por lo que he visto por ahí la cosa está complicada. ¿ Alguna idea ?
Re: Excel en modo edición de celda
Posted: Wed Mar 09, 2011 5:27 pm
by Manuel Valdenebro
Sebastian,
En mis aplicaciones, dejó que el usuario SAVE/EXIT de la Excel desde el menú de la propia Excel. Cuando no quiero que pregunte al cerrar la hoja, le pongo:
oExcel:Set("DisplayAlerts", .f.)
No sé si puede ayudarte, eliminar la opción para grabar la hoja desde la aplicación y obligar a que el usuario se pronuncie al salir de Excel con:
oExcel:Set("DisplayAlerts", .t.)
Re: Excel en modo edición de celda
Posted: Wed Mar 09, 2011 5:44 pm
by Sebastián Almirón
Manuel, gracias por responder.
El problema es que yo no puedo dejarles guardar con el menú de Excel, de hecho el usuario ni ve esa opción en Excel (ni el botón), porque solo puedo permitirle guardar en ciertas carpetas y después de hacer una exaustiva comprobación de que el libro tiene un montón de datos donde debe tenerlos (Son libros que se utilizan para crear estructuras de materiales en una fábrica).
Saludos
Re: Excel en modo edición de celda
Posted: Thu Mar 10, 2011 8:30 am
by anserkk
I have not tried, this is just an idea. While trying to save the excel workbook do a TRY CATCH
For eg.
Code: Select all
TRY
oExcel:ActiveWorkBook:Save()
CATCH oErr
if oErr:Number == -2147418111 // &H80010001
// Break the edit-mode. either by ESC or by Enter Key
Keyboard(chr(27))
MsgInfo ("Excel is in edit-mode")
End If
END
Please don't forget to give SysRefresh() inbetween
Anser
Re: Excel en modo edición de celda
Posted: Thu Mar 10, 2011 8:45 am
by Sebastián Almirón
Bueno solucionado, no hay nada como una buena pensada con la almohada:
Primero declaro una variables publica en mi main:
Public uerrorex := .f.
Al comienzo de la funcion errordialog de errsysw.prg le pongo:
if ErrorMessage( e ) = 'Error Excel.Application/1'
uerrorex := .t.
return .t.
endif
Luego en mis funciones de guardar, cerrar fichero, etc. hago la comprobación de que el objeto da error:
local omm := oexcel:CommandBars('Worksheet Menu Bar')
if uerrorex = .t.
MsgAlert('Para guardar o cerrar el libro salga antes del modo edicción')
uerrorex := .f.
return
endif
Por lo que he leido hacer esto con otros lenguajes es un quebradero de cabeza, pero con Fivewin ha sido simple.
Bieeeeeeen por Fivewin
Re: Excel en modo edición de celda
Posted: Thu Mar 10, 2011 8:53 am
by Sebastián Almirón
Thanks anser.
Did not read your answer, but I have an error:
Error BASE/1004 No
exported mehtod: NUMBER
Anyway, the idea is similar to mine.
Thanks
anserkk wrote:I have not tried, this is just an idea. While trying to save the excel workbook do a TRY CATCH
For eg.
Code: Select all
TRY
oExcel:ActiveWorkBook:Save()
CATCH oErr
if oErr:Number == -2147418111 // &H80010001
// Break the edit-mode. either by ESC or by Enter Key
Keyboard(chr(27))
MsgInfo ("Excel is in edit-mode")
End If
END
Please don't forget to give SysRefresh() inbetween
Anser
Re: Excel en modo edición de celda
Posted: Thu Mar 10, 2011 2:10 pm
by horacio
Sebastián, si no fuera mucha molestia podrías poner un trozo de coódigo de como manejas Excel a través de tu aplicación. Me interesa este tema porque me están pidiendo algo similar. Te agradezco de antemano.
Salu2
Re: Excel en modo edición de celda
Posted: Thu Mar 10, 2011 3:16 pm
by Sebastián Almirón
Hola Horacio:
Desde una opción de mi aplicación llamo (sin parámetro) o desde un dialogo (con parametro) a esta función para abrir el libro:
Code: Select all
function abresin(clib)
local hWndexcel
DEFAULT clib := ''
uerrorex := .f.
if empty(clib) //Si viene de una opción de menú se pide el libro a abrir y se comprueba que esté dentro de la carpeta apropiada
clibrosolver := cGetfile("Archivos Excel | *.XLS",'Selecionar libro',,ztcartraba )
if substr(clibrosolver,1,len(alltrim(ztcartraba))) <> alltrim(ztcartraba)
MsgAlert('Solo los libros que están en la carpeta de trabajo se pueden abrir con OfficeTC')
return
endif
else
clibrosolver := clib
endif
if empty(clibrosolver)
return
endif
if valtype(oexcelsolver) = 'O' //Si hay otro libro abrierto se cierra
oexcelsolver:quit()
oexcelsolver := nil
endif
oexce lsolver := CreateObject( "Excel.Application" )
oexcelsolver:RecentFiles:Maximum(0) //Elimina la lista de archivos recientes
oexcelsolver:WorkBooks:Open(clibrosolver)
sysrefresh()
SetWinLonA(oexcelsolver:hWnd,-16,"L") //Se quita la cabecera de la ventana excel
SetForeWin(oexcelsolver:hWnd) //
SetParent(oexcelsolver:hWnd,oWnd:hWnd) // Se mete la ventana de excel dentro del area cliente de mi aplicación
oWnd:SetText( cverotc + ' - Libro abierto: '+clibrosolver ) // Se pone titulo a la venta principal
oexcelsolver:ActiveWorkBook:Protect('',.f.,.f.)
oexcelsolver:WindowState(-4137) //Se maximiza la ventana de excel
oexcelsolver:Windows(1):WindowState(-4137) //Se maximiza la ventana del libro
delmenuex() //esta función quita del menu de excel las opciones de nuevo, guardar, la lista de lisbros recientes, etc y
oexcelsolver:Visible(.t.) //Se hace visible excel
oexcelsolver:Activeworkbook:Saved(.t.)
oMnu1030:Enable() //Se activan los botones de guardar, guardar como, cerrar, etc. de mi aplicación
oMnu1040:Enable()
oMnu1050:Enable()
oMnu1060:Enable()
return
//------------------------------------------------------------------------------
function delmenuex() //Oculta las opciones de excel que no queremos que aparezcan
oexcelsolver:CommandBars('Worksheet Menu Bar'):Visible(.t.)
oexcelsolver:CommandBars('Worksheet Menu Bar'):Controls('Archivo'):Controls('Nuevo...'):Visible(.f.)
oexcelsolver:CommandBars('Worksheet Menu Bar'):Controls('Archivo'):Controls('Abrir...'):Visible(.f.)
oexcelsolver:CommandBars('Worksheet Menu Bar'):Controls('Archivo'):Controls('Cerrar'):Visible(.f.)
oexcelsolver:CommandBars('Worksheet Menu Bar'):Controls('Archivo'):Controls('Guardar'):Visible(.f.)
oexcelsolver:CommandBars('Worksheet Menu Bar'):Controls('Archivo'):Controls('Guardar como...'):Visible(.f.)
oexcelsolver:CommandBars('Worksheet Menu Bar'):Controls('Archivo'):Controls('Guardar como página web...'):Visible(.f.)
oexcelsolver:CommandBars('Worksheet Menu Bar'):Controls('Archivo'):Controls('Buscar archivo...'):Visible(.f.)
oexcelsolver:CommandBars('Worksheet Menu Bar'):Controls('Archivo'):Controls('Salir'):Visible(.f.)
oexcelsolver:CommandBars:FindControls(1):ITem(1):Visible(.f.)
oexcelsolver:CommandBars:FindControls(1):ITem(2):Visible(.f.)
oexcelsolver:CommandBars:FindControls(1):ITem(3):Visible(.f.)
oexcelsolver:ActiveWorkBook:Protect('',.f.,.t.)
return
Bueno, es solo una muestra, pero esto me permite tener un control total sobre los libros, ya que las opciones de guardar, cerrar, abrir, etc. las tiene mi aplicación. Además está el tema de que excel "está" dentro de mi ventana.
Saludos
Re: Excel en modo edición de celda
Posted: Thu Mar 10, 2011 8:34 pm
by horacio
Sebastián, Muchas gracias por haber respondido. Probaré la rutina que me mandaste. Nuevamente muchas gracias
Re: Excel en modo edición de celda
Posted: Fri Mar 11, 2011 4:54 am
by anserkk
@Sebastian,
The following sample will eliminate the Excel error while trying to save an Excel workbook when Excel is in edit mode.
Code: Select all
#include "FiveWin.ch"
//----------------------//
Function Main()
Local oExcel,oBook
TRY
oExcel:= GetActiveObject( "Excel.Application" )
CATCH
TRY
oExcel:= CreateObject( "Excel.Application" )
CATCH
MsgInfo("Excel is not installed in this PC. Unable to continue")
Return .F.
END
END
oBook = oExcel:Workbooks:Open("D:\Test.xls")
oExcel:Visible(.T.)
// While executing the sleep, please press F2 key on your Excel window and type something
// so that you are in edit mode on excel. Do not press Enter Key or ESC
Sleep(6000)
TRY
oBook:Save()
CATCH oError
// Try with and without the keyboard command to raise the error
Keyboard chr(13)
oBook:Save()
MsgInfo("There was Error while saving, but solved perfectly")
END
oBook:Close()
oExcel:Quit()
oExcel:=NIL
Return NIL
Regards
Anser