Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2011, 10:38   #1
ZHDN
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 42
По умолчанию Не работают формулы в Excel при заполнении данных из Delphi

Код:
Код:
 ind:=14;
    DBGrid1.DataSource.DataSet.First;
    c := DBGrid1.DataSource.DataSet.RecordCount;
     For i:=1 to DBGrid1.DataSource.DataSet.RecordCount do
      Begin
       ProgressBar1.Position := (i * 100) div c;

       Sheet.Cells[ind,1]:=DataModule2.QueryPRG.FieldByName('Column1').Value;

       Sheet.Cells[ind,3].Columns.NumberFormat:='# #0,000';
       Sheet.Cells[ind,3]:=DataModule2.QueryPRG.FieldByName('Column2').Value;

       Sheet.Cells[ind,4].Columns.NumberFormat:='# #0,000';
       Sheet.Cells[ind,4]:=DataModule2.QueryPRG.FieldByName('Column3').Value;

       Sheet.Cells[ind,5].Columns.NumberFormat:='# #0,000';
       Sheet.Cells[ind,5]:=DataModule2.QueryPRG.FieldByName('Column4').Value;

       Sheet.Cells[ind,6].Columns.NumberFormat:='# #0,000';
       Sheet.Cells[ind,6]:=DataModule2.QueryPRG.FieldByName('Column5').Value;

       Sheet.Cells[ind,7].Columns.NumberFormat:='# #0,000';
       Sheet.Cells[ind,7]:=DataModule2.QueryPRG.FieldByName('Column6').Value;

       Sheet.Cells[ind,8].Columns.NumberFormat:='# #0,000';
       Sheet.Cells[ind,8]:=DataModule2.QueryPRG.FieldByName('Column7').Value;

       Sheet.Cells[ind,9].Columns.NumberFormat:='# #0,000';
       Sheet.Cells[ind,9]:=DataModule2.QueryPRG.FieldByName('Column8').Value;

       inc(ind);
       DBGrid1.DataSource.DataSet.Next;
      end;

    Sheet.Cells[ind+1,1].Columns.Font.Bold:=True;
    Sheet.Cells[ind+1,1].Columns.Font.Size:=12;
    Sheet.Cells[ind+1,1]:='Среднее';

    Sheet.Cells[ind+1,3].Columns.Font.Bold:=True;
    Sheet.Cells[ind+1,3].Columns.Font.Size:=12;
    Sheet.Cells[ind+1,3]:='=AVERAGE(C14:C37)';

    Sheet.Cells[ind+1,4].Columns.Font.Bold:=True;
    Sheet.Cells[ind+1,4].Columns.Font.Size:=12;
    Sheet.Cells[ind+1,4]:='=AVERAGE(D14:C37)';

    Sheet.Cells[ind+1,5].Columns.Font.Bold:=True;
    Sheet.Cells[ind+1,5].Columns.Font.Size:=12;
    Sheet.Cells[ind+1,5]:='=AVERAGE(E14:E37)';

    Sheet.Cells[ind+1,6].Columns.Font.Bold:=True;
    Sheet.Cells[ind+1,6].Columns.Font.Size:=12;
    Sheet.Cells[ind+1,6]:='=AVERAGE(F14:F37)';

    Sheet.Cells[ind+1,7].Columns.Font.Bold:=True;
    Sheet.Cells[ind+1,7].Columns.Font.Size:=12;
    Sheet.Cells[ind+1,7]:='=AVERAGE(G14:G37)';

    ExcelApp.Columns.AutoFit;
    ExcelApp.Visible:=True;
    ProgressBar1.Position := 0;
   end;
Поясняю если заканчиваем на ячейке номер 14(номер ячейки = ind) то
встаем на ячейку 16(ind+2). В этом случае все cчитается отлично.
Если же данные закончатся на ячейки G8 допустим. То Ексель начинает ругатся на зациклиность и не чего не считает. Подскажите как это исправить.
ZHDN вне форума Ответить с цитированием
Старый 30.07.2011, 13:17   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Если же данные закончатся на ячейки G8 допустим. То Ексель начинает ругатся на зациклиность и не чего не считает. Подскажите как это исправить.
ошибка вот тут:
Цитата:
Код:
    Sheet.Cells[ind+1,3]:='=AVERAGE(C14:C37)';

    Sheet.Cells[ind+1,4]:='=AVERAGE(D14:C37)';

    Sheet.Cells[ind+1,5]:='=AVERAGE(E14:E37)';

    Sheet.Cells[ind+1,6]:='=AVERAGE(F14:F37)';

    Sheet.Cells[ind+1,7]:='=AVERAGE(G14:G37)';
Формула должна зависеть от ind - получается что формула у Вас оказывается внутри диапазона, в котором она должна считать!

Кстати, если данных будет больше - тогда будет ещё хуже, ошибки не будет, но считаться будет неправильно (не все числа попадут в диапазон)!

правильно, думаю, будет так:
Код:
    Sheet.Cells[ind+1,3]:='=AVERAGE(C14:C'+IntToStr(ind)+')';
...
    Sheet.Cells[ind+1,4]:='=AVERAGE(D14:D'+IntToStr(ind)+')';
....
    Sheet.Cells[ind+1,5]:='=AVERAGE(E14:E'+IntToStr(ind)+')';

ну и т.д...
_______________

И ещё. во второй формуле диапазон задавался =AVERAGE(D14:C37) - это опечатка? Или Вам реально нужно среднее ДВУХ столбцов C и D ?
я решил, что опечатка и исправил в своём примере, если же это специально сделано так - тогда не забудьте вернуть обратно!

Последний раз редактировалось Serge_Bliznykov; 30.07.2011 в 13:20.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работают формулы mihakr Microsoft Office Excel 7 30.08.2017 13:36
Ошибка при заполнении TStringStream kakawkin Общие вопросы Delphi 2 05.10.2010 06:25
Ошибка при заполнении БД: EStackOverFlow insense БД в Delphi 7 29.06.2010 14:38
Сохранение имен столбцов при импорте данных из Delphi в Excel an4ik Общие вопросы Delphi 3 07.03.2009 15:23
Ошибка при заполнении таблицы masterdela БД в Delphi 6 26.01.2009 01:16