combobox en hoja de excel

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
edufloriv
Posts: 238
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

combobox en hoja de excel

Post by edufloriv »

Saludos amigos,

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:
EXCEL-FLUJO.png
EXCEL-FLUJO.png (93.93 KiB) Viewed 4624 times
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
Todo corre bien, pero cuando abro el excel generado en el escritorio me muestra todos los datos de la hoja en N/D:
EXCEL-FLUJO-2.png
EXCEL-FLUJO-2.png (321.53 KiB) Viewed 4624 times
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.

Eduardo Flores Rivas


LIMA - PERU
Post Reply