Crear una planilla de Excel, dar formato al texto y a las
celdas de una planilla de Excel y crear un gráfico en Excel desde Visual FoxPro
mediante OLE, ya se vio en números anteriores de FoxPress.
También podemos crear una Tabla Dinámica en Excel y así
brindar una información resumida a los usuarios de nuestros sistemas.
Esto lo lograremos mediante OLE de una forma muy simple
como se verá a continuación. Luego podemos darle formato a la tabla dinámica
con los comandos vistos anteriormente o convirtiendo las macros de Excel en
código de Visual FoxPro.
Para este ejemplo generamos una tabla y la llenamos con
datos aleatorios. Nuestra tabla "VENTAS.DBF" tiene la información de
las ventas de una concecionaria de automóviles que esta agrupada por por
Vendedor, Zona, Marca, Modelo y Año.
Nuestro resumen agrupará las ventas por Marca y Modelo y
podremos seleccionar la Zona y el Vendedor para filtrar los datos. En Excel
2000 también podremos filtrar las Marcas, los Modelos y los Años.
Para generar nuestra tabla dinámica, partimos del
generador de tablas dinámicas de Excel, el cual nos permite seleccionar los
datos en cuatro áreas como se ve en el siguiente gráfico:
En el área Página pondremos los campos Vendedor y Zona,
por los cuales podremos filtrar nuestra información. En el área Fila
colocaremos los campos Marca y Modelo. Al campo Año lo colocaremos en el área
Columnas. Finalmente, para obtener un total de las ventas, en el área Datos
colocaremos el campo Cantidad. Una vez finalizada esta tarea, el diseño de la
tabla dinámica se muestra en el siguiente gráfico.
Código para hacerlo desde Visual FoxPro
Una vez obtenida la tabla VENTAS, la copiamos en formato
XLS con la sentencia COPY TO ... TYPE XL5.
Creamos un objeto “Excel.Application”, abrimos la planilla
y creamos la tabla dinámica, según el diseño que vimos anteriormente.
Luego grabamos y cerramos la planilla. Como se dijo en
artículos anteriores, si deseamos que luego de generar la planilla con su tabla
dinámica, quede el Excel visible, no cerramos la planilla y la hacemos visible
con la propiedad: loExcel.APPLICATION.VISIBLE = .T.
El código en VFP lo mostramos a continuación y está entre los fuentes del mes.
*==========================================
SET SAFETY OFF
*--- Crea tabla de ventas
DO CreaTabla
*--- Genera tabla dinámica
DO GenTabla
CLOSE TABLES ALL
RETURN
*------------------------------------------
* PROCEDURE CreaTabla
*------------------------------------------
* Crea y llena la tabla de ejemplo y la
* copia
* como archivo tipo .XLS
*------------------------------------------
PROCEDURE CreaTabla
LOCAL lnVend, lnZona, lnMarca, lnmodelo, lnAnio, lnCant
LOCAL laZona(3), laMarca(3), laModelo(3,4)
laZona(1) = "SUR"
laZona(2) = "NORTE"
laZona(3) = "CENTRO"
*---- Cargo las marcas y modelos
laMarca(1) = "FORD"
laMarca(2) = "FIAT"
laMarca(3) = "VOLKSWAGEN"
laModelo (1,1) = "MONDEO"
laModelo (1,2) = "FIESTA"
laModelo (1,3) = "ESCORT"
laModelo (1,4) = "FOCUS"
laModelo (2,1) = "MAREA"
laModelo (2,2) = "BRAVO"
laModelo (2,3) = "SIENA"
laModelo (2,4) = "PALIO"
laModelo (3,1) = "GOL"
laModelo (3,2) = "GOLF"
laModelo (3,3) = "PASSAT"
laModelo (3,4) = "SAVEIRO"
*--- Inicializo la funcion RAND()
lnCant = RAND(-1)
*---- Creo tabla
CREATE TABLE Ventas (Vendedor C(2), Zona C(10), ;
Marca C(10), Modelo C(10), Anio N(4), Cantidad N(4))
*--- Cargo datos ALEATORIOS
FOR lnVend = 1 TO 3
FOR lnZona = 1 TO 3
FOR lnMarca = 1 TO 3
FOR lnmodelo = 1 TO 4
FOR lnAnio = 1998 TO 2000
lnCant = INT(RAND()*9)
IF lnCant > 0
INSERT INTO Ventas ;
(Vendedor, Zona, Marca, Modelo, Anio, Cantidad) ;
VALUES ;
(TRANSFORM(lnVend, "@L 99"), laZona(lnZona), ;
laMarca(lnMarca), laModelo(lnMarca,lnModelo), ;
lnAnio, lnCant)
ENDIF
ENDFOR
ENDFOR
ENDFOR
ENDFOR
ENDFOR
*--- Guardo como tipo XL5
SELECT Ventas
COPY TO Ventas TYPE XL5
RETURN
ENDPROC
*------------------------------------------
* PROCEDURE GenTabla
*------------------------------------------
* Crea una tabla dinámica en Excel
*------------------------------------------
PROCEDURE GenTabla
LOCAL laPagina(2), laFilas(2), laColumnas(1), lnI, ;
lnReg, lcRango, lcArchivo, loExcel
lnReg = RECCOUNT()
lcRango="A1:F"+ALLTRIM(STR(lnReg+1)) && Rango de celdas de la planilla
lcArchivo= SYS(5) + CURDIR() + "Ventas.xls"
*--- Arrays con los datos de la tabla dinámica
laPagina(1)="Vendedor"
laPagina(2)="Zona"
laFilas(1)="Marca"
laFilas(2)="Modelo"
laColumnas="Anio"
loExcel=CREATEOBJECT("Excel.application")
WITH loExcel.APPLICATION
.VISIBLE = .F. && oculto el trabajo en la aplicacion Excel
.workbooks.OPEN(lcArchivo)
*--- Formato datos numéricos
.Cells.SELECT
.SELECTION.COLUMNS.AutoFit
.RANGE("A1").SELECT
*=== Tabla dinámica ===
*--- Llamo al generador de Tablas Dinámicas
.ActiveSheet.PivotTableWizard(1,lcRango,"","MiTablaDinamica")
*--- Armo la Tabla
.ActiveSheet.PivotTables("MiTablaDinamica").AddFields(@laFilas, @laColumnas, @laPagina)
.ActiveSheet.PivotTables("MiTablaDinamica").PivotFields("Cantidad").ORIENTATION = 4
*--- Selecciono toda la hoja y ajusto columnas
.Cells.SELECT
.SELECTION.COLUMNS.AutoFit
.Sheets("Hoja1").NAME = "Tabla dinámica"
*--- Selecciono la celda donde queda el cursor
.RANGE("A3").SELECT
*--- Grabo planilla y cierro
.VISIBLE = .F.
.ActiveWorkbook.SAVE
.workbooks.CLOSE
ENDWITH
RELE loExcel
RETURN
ENDPROC
*==========================================
La tabla dinámica generada con
este ejemplo, es la siguiente, en donde podemos filtrar los datos que colocamos
en el área de Página (Zona y Vendedor).
Esto es un breve ejemplo. Se puede
cambiar el diseño de la tabla dinámica, grabando la macro en Excel y pasar el
código generado a Visual FoxPro según nuestras necesidades.
Hasta la próxima.
FoxPress – Febrero de 2000
© Luis María
Guayán.(Argentina)