martes, 20 de septiembre de 2005

Excel, macros y Delphi

Esta mañana he comenzado a hacer un pequeño proyecto en Delphi 7 (no, no uso ni pienso usar Delphi para .NET, creo que existen mejores opciones para desarrollar en Object Pascal para .NET); este pequeño proyecto consiste en crear un componente sencillo, que exporta una Macro, o módulo VBA, a una hoja Excel.

¿El motivo de esta chorrada? El siguiente:

Hoja.Columns.Item['M:T',EmptyParam].ColumnWidth := 6;
Hoja.Columns.Item['V:Y',EmptyParam].ColumnWidth := 6;
Hoja.Columns.Item['B',EmptyParam].ColumnWidth := 22;

Hoja.Cells.Item[4,26].Value := 'TOTALES';
Hoja.Range['Y4','AB4'].HorizontalAlignment := xlCenter;
Hoja.Range['Y4','AB4'].Merge(varNull);

// Dibuja todos los bordecitos, qué bonitos.
sv := inttostr(rowc+5);
Hoja.Range['D5','D'+sv].BorderAround(xlContinuous,xlMedium,xlAutomatic,EmptyParam);
Hoja.Range['F4','J'+sv].BorderAround(xlContinuous,xlMedium,xlAutomatic,EmptyParam);
Hoja.Range['M4','AC'+sv].BorderAround(xlContinuous,xlMedium,xlAutomatic,EmptyParam);

...

with Hoja.Range['P6','P'+sv].Borders.Item[xlEdgeLeft] do
begin
   LineStyle := xlContinuous;
   Weight := xlThin;
   ColorIndex := xlAutomatic;
end;
with Hoja.Range['S6','S'+sv].Borders.Item[xlEdgeLeft] do
begin
   LineStyle := xlContinuous;
   Weight := xlThin;
   ColorIndex := xlAutomatic;
end;
with Hoja.Range['V6','V'+sv].Borders.Item[xlEdgeLeft] do
begin
   LineStyle := xlContinuous;
   ...

Aquí apenas hay una fracción del código que se encarga de hacer "presentable" una hoja Excel. Cuando terminamos la exportación de los datos a la hoja, diseñamos las florituras y los encajes de bolillos, a mano en la misma hoja. Esto en teoría no debe llevar demasiado tiempo, unos minutos como máximo. Pero... luego hay que convertir todas estas florituras a código (bordes, fuentes, colores, formatos, incluso fórmulas) ya sea en Delphi, VisualBasic, VB.NET, C# o lo que sea. Y esto puede llevar un buen rato; una tarde entera en mi caso. Claro, hay que buscar qué tipos de LineStyles, por poner un ejemplo, se pueden aplicar a un rango; yo las constantes tipo xlLoQueSea no me las conozco (suerte que existe esa maravilla llamada MSDN Library, porque todo esto en las ayudas de Delphi no viene).

Y si además, sabes que no va a ser el único informe en Excel que vas a tener que presentar a tus jefes, para que éstos a su vez los presenten a los suyos (y llevarse todo el mérito por supuesto) entonces se necesita una solución drástica. Y la solución en éste caso, nos la da el propio Excel con sus Macros (bueeeno, vale, módulos VBA).

Cuando terminemos la exportación de los datos a la hoja Excel, y vayamos a hacer el diseño previo de los bordes y demás adornos, vamos al menú Herramientas | Macro | Grabar nueva macro. Todas las operaciones que hagamos, las grabaremos en esta macro. La idea es, que desde nuestra aplicación que exporta datos a hojas Excel, exportemos también la macro que hace los adornos y la ejecutemos. El ahorro en tiempo es escandaloso (vamos, el tiempo que nos lleve hacer un Copiar-Pegar desde el editor VBA de Excel al código de nuestra aplicación).

Cuando lo tenga terminado os cuento. :)

1 comentario:

Javier Garcia dijo...

Aqui tienes muy buenos ejemplos de funciones para trabajar con excel usando delphi
http://delphimagic.blogspot.com.es/2013/03/trabajar-con-graficos-en-excel-con.html
http://delphimagic.blogspot.com.es/2013/03/funciones-excel.html