Saludos
Bueno...despues de quemarme las pestañas, no he visto la causa por el que te dá ese error de memoria, pero te puedo ayudar a que reduzca considerablemente el codigo, ademas de aconsejarte a que Identes el mismo, porque es dificilisimo leerlo.
Comencemos, veo que hay codigo repetidos, dependiendo del RadioGruop que esté marcado, el cual asigna y query 'X'. Esto lo puedes reducir con la declaracion de una variable (por ejemplo) con la clase Tquery
Declaramos la variable
Comenzamos a reducir y reutilizar el codigo
Código Delphi
[-]
case radiogroup2.ItemIndex of
0: DbUso:=qryPrimerSemestre;
1: DbUso:=qrySegundoSemestre;
End;
with SaveDialog1 do
begin
FileName := '';
Filter := 'Excel files|*.XLS;All Files|*.*';
DefaultExt := 'xls';
Title := 'Exportando a Excel';
if execute then
begin
DbUso.Open;
LCID := GetUserDefaultLCID;
with ExcelApplication1 do
begin
connect;
try
visible[LCID] := true;
Workbooks.Add(EmptyParam,LCID);
Range['A1','R1'].Value2 := VarArrayOf(['Codigo APS','Mes','Documento','Apellido y Nombre','Rama Enza.','Código del Cargo','Carga Horaria', 'Tipo de Cargo', 'Sit. Revista','Subvención','Asist.','Clave identif.','Años de Antiguedad','O. social',
'Sexo','Cuil','CUE','Nivel']);
with Range['A1','R1'] do
begin
HorizontalAlignment := xlcenter;
VerticalAlignment := xlBottom;
Wraptext := false;
orientation := 0;
ShrinkTofit := false;
MergeCells := false;
font.Bold := true;
end;
DbUso.First;
LineNumber := 1;
while not DbUso.Eof do
begin
if (DbUso.FieldByName('Carga_horaria').IsNull) and (DbUso.FieldByName('Carga_C').IsNull) then
hsTotal := 'Nulo' else
begin
if DbUso.FieldByName('carga_horaria').AsInteger <= 0 then
hstotal := DbUso.FieldByName('carga_c').AsString
else
hstotal := DbUso.FieldByName('carga_horaria').AsString;
end;
if strtoint(trim(DbUsodni.Value)) < 10000000 then
dni := DbUso.FieldByName('sexodni').Value
else
dni := DbUso.FieldByName('dni').AsString;
if DbUso.FieldByName('totalantig').IsNull then
antiguedad := DbUso.FieldByName('Antig').Value
else
antiguedad := DbUso.FieldByName('totalAntig').Value;
if DbUso.FieldByName('rama2').IsNull then
ramaEnza := DbUso.FieldByName('rama').Value
else
ramaEnza := DbUso.FieldByName('Rama2').Value;
if DbUso.FieldByName('asist').IsNull then
asist := DbUso.FieldByName('asist1').AsInteger
else
asist := DbUso.FieldByName('asist').AsInteger;
if asist > 30 then
asist := 30;
Inc(LineNumber);
LineString := IntToStr(LineNumber);
Range['A'+LineString,'R'+LineString].Value2:=
VarArrayOf([DbUso.FieldByName('enrollment_code').value,DbUso.FieldByName('period').Value,dni, DbUso.FieldByName('name_full').Value, ramaEnza,DbUso.FieldByName('cod_cargo').Value, hstotal,DbUso.FieldByName('personal').Value,DbUso.FieldByName('sitRev').Value, DbUso.FieldByName('subv').Value,asist,DbUso.FieldByName('clave').Value,antiguedad, DbUso.FieldByName('obra_social').Value,DbUso.FieldByName('sexo').Value, DbUso.FieldByName('Cuil').Value,DbUso.FieldByName('Semestrecode_denominational').Value, DbUso.FieldByName('nivel').Value]);
DbUso.Next;
end;
Range['A1','R'+ LineString].AutoFormat(xlRangeAutoFormatList1,true,true,true,true,true,true);
Range['A1','R'+ LineString].Columns.AutoFit;
Range['A1','R'+ LineString].HorizontalAlignment := xlcenter;
ActiveWorkbook.SaveAs(FileName,null,null,null,false,false,xlnochange,
xlUserResolution,false,null,null,LCID,0);
Quit;
finally
disconnect;
end; end; end;end;
Ya con esto, te has ahorrado la mitad del codigo (La parte azul), DbUso puede contener el 1ro o 2do qry.
Fijate bien, que he realizado algunos cambios , como por ejemplo utilizar FieldbyName(). para asignar valor a los campos.
No soy muy bueno explicando, espero que enteindas. Analizalo un poco
Saludos