Tengo una plantilla de excel que tiene varias hojas la cual esta toda referenciada con formulas para realizar unos proyectados contables, yo solo debo llenar las ventas y compras mensuales.
El tema es que en la primera hoja hay un COMBOBOX que muestra 4 tipos diferentes de proyectados:
Este es el código con el que lleno la plantilla de excel para finalmente grabarla con un nuevo nombre en el escritorio del usuario:
Code: Select all
PROC FlujoContable_Aceptar
LOCAL cActual := Win_FlujoCont.CmbAnual.DisplayValue
LOCAL qCompC
LOCAL oCompC
LOCAL nCompC
LOCAL qVentC
LOCAL oVentC
LOCAL nVentC
LOCAL oExcel
LOCAL oHoja
LOCAL oWorkBook
LOCAL aCompras := {0,0,0,0,0,0,0,0,0,0,0,0}
LOCAL aVentas := {0,0,0,0,0,0,0,0,0,0,0,0}
LOCAL cExcelOrigen := CFG_PUBLIC+'Formas\FLUJO_CONTABLE.xlsx' //<-plantilla original con compras y ventas en cero.
LOCAL cExcelNueva := GetDesktopFolder() + '\FLUJO_CONTABLE_' + cActual + '.xlsx' //<-el nuevo excel con los datos cargados.
LOCAL nFilIni := 9
// EXTRACCION DE COMPRAS
Win_FlujoCont.TxtProgreso.Value := 'Extrayendo compras...'
do events
qCompC := ;
"SELECT substring(CC_FECHA,5,2) AS MES,SUM(CC_SUBTTL) AS TOTSUB,SUM(CC_IGVTTL) AS TOTIGV,SUM(CC_DOCTTL) AS TOTDOC "+;
"FROM COMPRASC "+;
"WHERE LEFT(CC_FECHA,4) = '"+cActual+"' AND CC_ESTADO = 'OK' "+;
"GROUP BY substring(CC_FECHA,5,2) "+;
"ORDER BY substring(CC_FECHA,5,2) "
oCompC := TOleAuto():New('ADODB.Recordset')
oCompC:CursorLocation = adUseClient
oCompC:Open( qCompC , oConexion , adOpenForwardOnly , adLockReadOnly )
IF oCompC:RecordCount() > 0
FOR nCompC = 1 to oCompC:RecordCount()
aCompras[nCompC] := oCompC:Fields("TOTSUB"):Value
oCompC:MoveNext()
NEXT
ENDIF
oCompC:Close()
// EXTRACCION DE VENTAS
Win_FlujoCont.TxtProgreso.Value := 'Extrayendo ventas...'
do events
qVentC := ;
"SELECT substring(VC_FECHA,5,2) AS MES,SUM(VC_TOTSUB) AS TOTSUB,SUM(VC_TOTIGV) AS TOTIGV,SUM(VC_TOTPRC) AS TOTDOC "+;
"FROM VENTASC "+;
"WHERE LEFT(VC_FECHA,4) = '"+cActual+"' AND VC_ESTADO = 'OK' "+;
"GROUP BY substring(VC_FECHA,5,2) "+;
"ORDER BY substring(VC_FECHA,5,2) "
oVentC := TOleAuto():New('ADODB.Recordset')
oVentC:CursorLocation = adUseClient
oVentC:Open( qVentC , oConexion , adOpenForwardOnly , adLockReadOnly )
IF oVentC:RecordCount() > 0
FOR nVentC = 1 to oVentC:RecordCount()
aVentas[nVentC] := oVentC:Fields("TOTSUB"):Value
oVentC:MoveNext()
NEXT
ENDIF
oVentC:Close()
// TRASLADO A LA HOJA DE EXCEL
Win_FlujoCont.TxtProgreso.Value := 'Generando excel...'
do events
oExcel := CREATEOBJECT( "Excel.Application" )
oExcel:Visible := .F.
oExcel:DisplayAlerts := .F.
oWorkBook := oExcel:WorkBooks:Open(cExcelOrigen)
oExcel:Sheets(2):Select()
oHoja := oExcel:ActiveSheet
FOR nComp = 1 TO LEN(aCompras)
oHoja:cells(nFilIni+nComp,3):value := aCompras[nComp]
NEXT
oExcel:Sheets(3):Select()
oHoja := oExcel:ActiveSheet
FOR nVent = 1 TO LEN(aVentas)
oHoja:cells(nFilIni+nVent,3):value := aVentas[nVent]
NEXT
oExcel:Sheets(1):Select()
oHoja := oExcel:ActiveSheet
oHoja:cells(2,2):value := Win_FlujoCont.CmbTipo.DisplayValue //<-aqui es donde trato de manipular el combobox
oExcel:ActiveWorkbook:SaveAs( cExcelNueva )
oWorkBook:Close()
oExcel:Quit()
oHoja := NIL
oWorkBook := NIL
oExcel := NIL
RELEASE oHoja
RELEASE oWorkBook
RELEASE oExcel
Win_FlujoCont.TxtProgreso.Value := 'Flujo contable generado en el escritorio.'
do events
RETURN
Si yo de forma manual hago click en el combobox y selecciono cualquier opción allí si lo refresca y muestra los datos nuevos. ¿ Como puedo hacer para que mi usuario cuando abra la hoja nueva vea los datos ya refrescados sin necesidad que lo haga manualmente ? - He buscado la info en microsoft y he probado con estos pero no sirve:
oExcel:ActiveWorkbook(1):RefreshAll()
oExcel:Sheets(1):RefreshAll()
¿ Alguien ha realizado algo similar ? - Agradeceré su ayuda.
Esperando se encuentren bien de salud ustedes y su familias.