FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Excel en modo edici贸n de celda
Posts: 166
Joined: Mon Dec 12, 2005 09:56 AM
Excel en modo edici贸n de celda
Posted: Wed Mar 09, 2011 05:13 PM

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 ?

Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
Re: Excel en modo edici贸n de celda
Posted: Wed Mar 09, 2011 05:27 PM

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
Posts: 166
Joined: Mon Dec 12, 2005 09:56 AM
Re: Excel en modo edici贸n de celda
Posted: Wed Mar 09, 2011 05:44 PM

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

Posts: 1335
Joined: Fri Jun 13, 2008 11:04 AM
Re: Excel en modo edici贸n de celda
Posted: Thu Mar 10, 2011 08:30 AM
I have not tried, this is just an idea. While trying to save the excel workbook do a TRY CATCH

For eg.

Code (fw): Select all Collapse
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
Posts: 166
Joined: Mon Dec 12, 2005 09:56 AM
Re: Excel en modo edici贸n de celda
Posted: Thu Mar 10, 2011 08:45 AM

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

Posts: 166
Joined: Mon Dec 12, 2005 09:56 AM
Re: Excel en modo edici贸n de celda
Posted: Thu Mar 10, 2011 08:53 AM
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 (fw): Select all Collapse
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
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Excel en modo edici贸n de celda
Posted: Thu Mar 10, 2011 02:10 PM

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

Posts: 166
Joined: Mon Dec 12, 2005 09:56 AM
Re: Excel en modo edici贸n de celda
Posted: Thu Mar 10, 2011 03:16 PM
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 (fw): Select all Collapse
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
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Excel en modo edici贸n de celda
Posted: Thu Mar 10, 2011 08:34 PM

Sebasti谩n, Muchas gracias por haber respondido. Probar茅 la rutina que me mandaste. Nuevamente muchas gracias

Posts: 1335
Joined: Fri Jun 13, 2008 11:04 AM
Re: Excel en modo edici贸n de celda
Posted: Fri Mar 11, 2011 04:54 AM
@Sebastian,
The following sample will eliminate the Excel error while trying to save an Excel workbook when Excel is in edit mode.
Code (fw): Select all Collapse
#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

Continue the discussion