Excel en modo edición de celda

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

Excel en modo edición de celda

Post 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 ?
Last edited by Sebastián Almirón on Wed Mar 09, 2011 5:49 pm, edited 1 time in total.
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: Excel en modo edición de celda

Post 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.)
Un saludo

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

Re: Excel en modo edición de celda

Post 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
User avatar
anserkk
Posts: 1280
Joined: Fri Jun 13, 2008 11:04 am
Location: Kochi, India

Re: Excel en modo edición de celda

Post 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
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: Excel en modo edición de celda

Post 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
Last edited by Sebastián Almirón on Thu Mar 10, 2011 8:56 am, edited 1 time in total.
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: Excel en modo edición de celda

Post 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
horacio
Posts: 1270
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Excel en modo edición de celda

Post 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
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: Excel en modo edición de celda

Post 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
horacio
Posts: 1270
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Excel en modo edición de celda

Post by horacio »

Sebastián, Muchas gracias por haber respondido. Probaré la rutina que me mandaste. Nuevamente muchas gracias
User avatar
anserkk
Posts: 1280
Joined: Fri Jun 13, 2008 11:04 am
Location: Kochi, India

Re: Excel en modo edición de celda

Post 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
Post Reply