PDA

Ver la Versión Completa : Subtotales de Excel


adfa76
07-06-2007, 21:57:57
Hola gente.
Estoy intentando usar desde un programa hecho en Delphi 7 la función subtotal de Excel.

excel.range['a2:g50'].Subtotal(1,-4157,4,false,false,true);

Una macro de excel al grabarla haciendo los subtotales hace esto:

Sub Macro1()
Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4,6), _
Replace:=False, PageBreaks:=False, SummaryBelowData:=True
End Sub

Este tema por lo que vi fue tratado en este post.
21959 (http://www.clubdelphi.com/foros/showthread.php?t=21959)
Si bien la solución encontrada por tutuk (http://www.clubdelphi.com/foros/member.php?u=13) es funcional me gustaria poder hacerla un poco más elegante (sobre todo porque no es tan sencillo para mi aplicacion el ir recorriendo las celdas para pegar la formula).

El problema radica en el parametro "TotalList" de la funcion que segun la ayuda del Excel recibe un Variant con una matriz adentro.
Si ejecuto el programa tal cual la sentencia que esta arriba funciona, pero no le he encontrado la vuelta para poder totalizar más de una columna.

He provado usar la funcion varArrayOf([4,6]) por ejemplo para totalizar esas 2 columnas pero no he tenido suerte, hay un tema con los tipos y no me doy cuenta que es.

Alguien tiene como hacerlo funcionar.

Saludos

adfa
11-06-2007, 17:05:24
Bueno, me contesto yo :) :)
Eso que yo hacia; lo hacia creando un objeto con:

var
excel: Variant;
excel := CreateOleObject('Excel.Application');
//varias escrituras en celdas
excel.selection.Subtotal(1,-4157,varArrayOf([4]),false, false,true);

Bien, esto funciona de maravilla.
Ahora esto no funciona, da un error el Excel.

var
excel: Variant;
excel := CreateOleObject('Excel.Application');
//varias escrituras en celdas
excel.selection.Subtotal(1,-4157,varArrayOf([4,5]),false, false,true);


Hice la prueba con los componentes de la paleta server.

var
hoja : _WORKSHEET;
libro : _WORKBOOK;
i: integer;
begin
libro := ExcelApplication1.Workbooks.Add(NULL, 0);
Hoja := Libro.Sheets[1] as WORKSHEET;
//varias escrituras en celdas
hoja.Range[hoja.Cells.Item[1,1],hoja.Cells.Item[4,3]].Subtotal(1,xlSum,varArrayOf([4,5]),false,false,xlSummaryBelow);
ExcelApplication1.Visible[0] := true;

Esto funciona perfecto, ahora bien encontre la solución pero tengo que reescribir casi toda la aplicación para usar los componentes de la solapa server. :(
Pero bueno lo hago, no me da pereza aunque me falta el tiempo.
Lo que no me gusta es quedarme con la intriga, alguien puede decirme porque el varArrayOf en un caso funciona y en otro no??

Saludos y gracias