IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

3 страниц V < 1 2 3 >  
 Ответить  Открыть новую тему 
> Отчет Excel
сообщение
Сообщение #21


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Бесят уже.
Сами по невнимательности всё партачат, а потом то "твой код глючит", то "у меня не компилируется".


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(IUnknown @ 3.05.2011 16:03) *

Ну, а какого ты сверху написал ":=", а здесь, ниже, уже пишешь "="? Требуется-то именно присваивание, переменная же...

уже разобрался, не стал отписывать... Признаю мой косяк.

Сообщение отредактировано: Atreides -


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +



1. После завершения работы, остается висящий процесс в диспетчере задач, после накапливаются там и тормозят работу, приходиться в ручную убивать процессы.
2. При повторном обращении к выдаче отчета вылетает ошибка, что ClientDataSet не может найти поле Kodorg. Приходиться закрывать и заново открывать прожку. Хотя прописал закрытие ClientDataSet после открытия эксельного файлика.

Сообщение отредактировано: Atreides -


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Попробовал так, заполняется неплохо, но с отставанием на 1 лист, ибо первый код вписывается на первый лист – пустой и не удаляется.
Разумеется. Ты ж записываешь данные еще ДО создания листа, куда пишется массив Data. Перенеси эту строку куда-нибудь ниже
Curr := ActiveBook.Sheets.Add (Type := TemplateSheet, After := Curr); // Вот этой строки

- "отставания" не будет... Да, ToCell3 присваивать новое значение надо тоже после Add-а уже, ибо ячейка - на новом листе...

Цитата
2. После завершения работы, остается висящий процесс в диспетчере задач, после накапливаются там и тормозят работу, приходиться в ручную убивать процессы.
Завершай Excel корректно - не будет оставаться:

  ActiveBook.Sheets[1].Delete; // Это я уже показывал
XLApp.Workbooks[1].SaveAs(ReportName); // <--- Сохраняем куда надо
XLApp.Quit; // <--- И убираем из процессов
XLApp := Unassigned;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(IUnknown @ 4.05.2011 16:11) *

Разумеется. Ты ж записываешь данные еще ДО создания листа, куда пишется массив Data. Перенеси эту строку куда-нибудь ниже
Curr := ActiveBook.Sheets.Add (Type := TemplateSheet, After := Curr); // Вот этой строки

- "отставания" не будет... Да, ToCell3 присваивать новое значение надо тоже после Add-а уже, ибо ячейка - на новом листе...


Да и снова я погорячился и буквально после поста сам исправил.


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Хотя прописал закрытие ClientDataSet после открытия эксельного файлика.
И после этого удивляешься,
Цитата
что ClientDataSet не может найти поле Kodorg
??? А как ты хотел, чтоб при закрытом наборе данных что-то находилось? "Фантастика - в следующем зале" (С) Все, что тебе надо сделать после захода в процедуру - это сбросить признак фильтрации, чтоб начиналась работа с нефильтрованным набором. Потом, когда понадобится, фильтрация опять будет включена...
   ClientDataSet1.Filtered := False;
, закрывать ничего не надо...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Никак не могу найти ошибку, на каждой странице не хватает по три записи, где теряются не понимаю. Так же иногда получается, что данные вписываются в шапку, заполняют собой шапку и на этом появляется запись #НД

Код

procedure TForm5.BitBtn3Click(Sender: TObject);

var
  workBooks, activeBook, curr, Range: Variant;
  CellStart, CellFinish: Variant;
  sPlace: string;
  Ls: TStringList;
  i, iRec: Integer;
  Data: Variant;
  st: string;
  col: integer;
  year, MonthSelected: string;
  oth: string;
  direct: string;
  IDSOURCE, PR_MEST: string;
  priznak: string;
  NO_FAM: string;
  ID_TRAN: string;
  ToCell, ToCell2, ToCell3: string;
  value, value2: string;
  mesto: string;
  nametext: string;
  TemplateSheet: string;

begin

  ToCell := 'C1'; // Var ToCell : String;
  ToCell2 := 'A6';
  ToCell3 := 'B8';

  value := Form5.ComboBox1.Text + ' ' + Form5.Edit1.Text + ' г.';
  value2 := DateTimeToStr(Now);
  ID_TRAN := Form5.ComboBox2.Text;
  mesto := IntToStr(Form5.ComboBox4.ItemIndex);
  year := Form5.Edit1.Text;
  MonthSelected := FloatToStr(Form5.ComboBox1.ItemIndex + 1);
  priznak := IntToStr(Form5.ComboBox3.ItemIndex + 1);

  oth := 'select ID_OTCHM from sprotchmonth where YEAROTCH = ' + year + ' and MONTHOTCH = ' + MonthSelected + '';
  Form5.ClientDataSet1.close;
  Form5.ClientDataSet1.DataRequest(oth);
  Form5.ClientDataSet1.open;
  oth := Form5.ClientDataSet1.fieldbyname('id_otchm').asstring;


  st := 'select ID_TRANS from SPR_TRANS t where t.NAME_TRANS=' + #39 + ID_TRAN + #39 + '';
  Form5.ClientDataSet2.close;
  Form5.ClientDataSet2.DataRequest(st);
  Form5.ClientDataSet2.open;
  ID_TRAN := Form5.ClientDataSet2.fieldbyname('ID_TRANS').asstring;


  IDSOURCE := 'select * from SPR_TRANS t, SPRSOURCEDATA s where   ' +
    ' t.Id_Trans =' + #39 + ID_TRAN + #39 + ' and t.Id_Trans=s.Id_Trans and s.Pr_Mest=' + #39 + mesto + #39 + '';
  Form5.ClientDataSet1.close;
  Form5.ClientDataSet1.DataRequest(IDSOURCE);
  Form5.ClientDataSet1.open;
  IDSOURCE := Form5.ClientDataSet1.fieldbyname('ID_SOURCE').asstring;
  PR_MEST := Form5.ClientDataSet1.FieldByName('Pr_MEST').AsString;
  NO_FAM := Form5.ClientDataSet1.FieldByName('NO_ONE_FAM').AsString;
  nametext := Form5.ClientDataSet1.FieldByName('NAMETEXT').AsString;


  begin

    if mesto = '0' then

    begin

      st := ' select   s.SHORT_NAME, l.Kodorg, kod.forma_tt, l.Kodpodr, ';

      if NO_FAM = '0' then


        st := st + ' l.FIO,'
      else
        st := st + ' (rpad(l.FIO,38) ||rpad(l. FIODEPEN,38)) FIO, ';

      st := st + 'l.n_Doclgotn,    ' +

      '   l.Date_Opd, l.Date_Begin_Ab, l.n_Opd, Sposob_Opd,   ' +

      '  l.vid_period_ab, l.kol_doc,   ' +

      '     STAT_OTPR, ' +

      '    STAT_NAZN, summa, SUMMA_DOP,  sysdate  ' +

      '      from *****    ' +

      ' where l.Id_Otchm= ' + oth + ' and l.Id_Source=' + IDSOURCE + ' ' +

      ' and lor.pr_attrib=' + priznak + ' ' +

         '     order by l.Kodorg, s.SHORT_NAME  asc  ';

      Form5.ClientDataSet1.close;
      Form5.ClientDataSet1.DataRequest(st);
      Form5.ClientDataSet1.open;

      if Form5.ClientDataSet1.RecordCount = 0 then
      begin
        ShowMessage('Записи отсуствуют');
      end
      else
      begin
        XLApp := CreateOleObject('Excel.Application');
// XLApp.Visible := True;
        XLApp.SheetsInNewWorkbook := 1; // Добавим 1 лист - 3 (по умолчанию)

        workBooks := XLApp.WorkBooks;
        ActiveBook := workBooks.Add;
        Curr := ActiveBook.Sheets[1]; // Запомним добавленный лист

        try
          Ls := TStringList.Create;

    // заполнение

          ClientDataSet1.First;
          while not ClientDataSet1.Eof do
          begin
            sPlace := ClientDataSet1.FieldByName('Kodorg').AsString;
            if Ls.IndexOf(sPlace) = -1 then
            begin
              Ls.Add(sPlace);
            end;
            ClientDataSet1.Next;
          end;

          for i := 0 to Pred(Ls.Count) do
          begin
            ClientDataSet1.Filtered := False;
            ClientDataSet1.Filter := 'Kodorg = ' + QuotedStr(Ls.Strings[i]);
            ClientDataSet1.Filtered := True;

            Data := VarArrayCreate([1, ClientDataSet1.RecordCount, 1, 14], varVariant);
            ClientDataSet1.First;
            iRec := 0;
            while not ClientDataSet1.Eof do
            begin


              Data[iRec + 1, 1] := ClientDataSet1.FieldByName('SHORT_NAME').AsString;
              Data[iRec + 1, 2] := ClientDataSet1.FieldByName('forma_tt').AsString;
              Data[iRec + 1, 3] := ClientDataSet1.FieldByName('KODPODR').AsString;
              Data[iRec + 1, 4] := ClientDataSet1.FieldByName('FIO').AsString;
              Data[iRec + 1, 5] := ClientDataSet1.FieldByName('n_Doclgotn').AsString;
              Data[iRec + 1, 6] := ClientDataSet1.FieldByName('Date_Opd').AsString;
              Data[iRec + 1, 7] := ClientDataSet1.FieldByName('Date_Begin_Ab').AsString;
              Data[iRec + 1, 8] := ClientDataSet1.FieldByName('n_Opd').AsString;
              Data[iRec + 1, 9] := ClientDataSet1.FieldByName('Sposob_Opd').AsString;
              Data[iRec + 1, 10] := ClientDataSet1.FieldByName('vid_period_ab').AsString;
              Data[iRec + 1, 11] := ClientDataSet1.FieldByName('kol_doc').AsString;
              Data[iRec + 1, 12] := ClientDataSet1.FieldByName('STAT_OTPR').AsString;
              Data[iRec + 1, 13] := ClientDataSet1.FieldByName('STAT_NAZN').AsString;
              Data[iRec + 1, 14] := ClientDataSet1.FieldByName('SUMMA').AsString;

              Inc(iRec);

              ClientDataSet1.Next;

            end;

      //  добавляем новый личт из шаблона ПОСЛЕ того, что был текущим
            Curr := ActiveBook.Sheets.Add(type := TemplateSheet, After := Curr);
            Curr.Name := Ls.Strings[i];

            //разметка страницы
            curr.PageSetup.PrintArea := 'A1:N' + inttostr(irec + 12);
            curr.PageSetup.Zoom := 60;
            curr.PageSetup.Orientation := 2;
            //разметка страницы

            CellStart := Curr.Cells[12, 1];
            CellFinish := Curr.Cells[iRec + 8, 14]; // корректировка позиции вставки
            Range := Curr.Range[CellStart, CellFinish];
            Curr.Range[ToCell] := value2;
            Curr.Range['D12:D' + inttostr(irec + 12)].WrapText := True;
            Curr.Range[ToCell2] := '  ЗA ' + value;
            Curr.Range[ToCell3] := (Ls.Strings[i]);

            Range.Value := Data;

            VarClear(Data);
          end;

        finally
          Ls.Free;
        end;
        ClientDataSet1.Filtered := False;
        Form5.ClientDataSet1.close;
        ActiveBook.Sheets[1].Delete; // удаление первого листа
        XLApp.Visible := True;
      //  XLApp.Workbooks[1].SaveAs('C:\' + nametext + '.xls'); // <--- Сохраняем куда надо
     //   XLApp.Quit; // <--- И убираем из процессов
        XLApp := Unassigned;



      end;
      Form5.ComboBox1.ItemIndex := (-1);
      Form5.ComboBox2.ItemIndex := (-1);
      Form5.ComboBox3.ItemIndex := (-1);
      Form5.ComboBox4.ItemIndex := (-1);
      Form5.Edit1.Clear;
    end;


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
на каждой странице не хватает по три записи, где теряются не понимаю.
Я тебе объясню...

Вот тут:
Цитата
            CellStart := Curr.Cells[12, 1];
CellFinish := Curr.Cells[iRec + 8, 14]; // корректировка позиции вставки
Range := Curr.Range[CellStart, CellFinish];

ты что-то намудрил. Если начальная позиция - строка №12, первый столбец, то для того, чтоб занести iRec строк и 14 столбцов, надо конечную позицию считать так:

CellFinish := Curr.Cells[12 + iRec - 1, 14];
, у тебя же отчет данные недоговаривает.

Насчет разных непредвиденных значений... У тебя, насколько я вижу, есть несколько полей типа ftData? Так вот, когда поле типа ftString переносится в Excel, и ему не хватает ширины столбца, чтоб полностью показаться, ничего страшного не происходит: показывается часть строки, а часть - отрезается. Совсем другое дело с ftData: если ему не хватает ширины столбца - то отображается #####, надо изменять ширину столбца. Как только изменишь, и этой ширины хватит - покажется дата.

#НД в шапке? Прогнал программу раз 15, с разными данными в ClientDataSet - ни разу в шапку ничего не залезло. Да и не может, в принципе, если ты поправишь вычисление CellFinish. Если все-же поймаешь такое поведение - скажи, сколько было записей в ClientDataSet на тот момент, когда переносились данные, я попробую сгенерировать набор с таким же количеством данных и проверить поведение у себя. И еще: желательно было бы иметь информацию, в каких именно ячейках появляется #НД

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Поправка на поля исправила ошибку с не хватающими записями и шапкой. Записей у меня 9548 штук. )) Возникла трудность - как экселю сообщить, что в ячейку пишется формула, а не просто текст. Написал формулу подсчета сумм, но отображается формула, если нажать энтер, то нормально сумма отображается, а так ток "#ИМЯ?". Это у меня по общей сумме.
Код
                      
position:=IntToStr(irec+11);                  
ToCell5:='N'+inttostr(irec + 12);
Curr.Range[ToCell5] := '=СУММ(N12:N'+position+')';


И еще можно цикл сделать, например на каждой закладке у меня по данным есть поле с формами (они упорядочены у меня запросом от меньших к большим). Как только появилась новое значение ( к примеру с 6 сменилось на 7) то отписать под ними строку итого и сумму и продолжить вывод данных?


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
как экселю сообщить, что в ячейку пишется формула, а не просто текст.
Надо сказать об этом:
Curr.Range[ToCell5].Formula := '=СУММ(N12:N'+position+')';
Логично? smile.gif По крайней мере, на англоязычном Оффисе вот такой код работает прекрасно: Curr.Range['A11'].Formula := '=Sum(A1:A10)';

Цитата
например на каждой закладке у меня по данным есть поле с формами (они упорядочены у меня запросом от меньших к большим). Как только появилась новое значение ( к примеру с 6 сменилось на 7) то отписать под ними строку итого и сумму и продолжить вывод данных?
Не понял. Это в тех данных, которые ты из Дельфи перетягивал, или ты еще что-то свое делаешь в этих закладках? Если то, что из Delphi - то прямо при заполнении массива Data это желательно делать. Хотя, конечно, можно и потом пробежаться по содержимому листа, и проверить, где меняется значение в определенном поле. Тебе для этого даже сумму считать не придется, достаточно только знать, в каком ряду это значение началось, и в каком - заканчивается. В общем, приведи пример, как у тебя на листе данные располагаются, и что с ними надо сделать...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


С формулами разобрался, отлично подсчитал общие итоги.
Кинул пример файлика с итогами, которые мне нужны, выделил красным. Т.е на каждой закладке внизу заполнить итоги по каждому наименованию с отдельной формой и суммой, и общий итог по всем.

Сообщение отредактировано: Atreides -


Прикрепленные файлы
Прикрепленный файл  _____1.xls ( 122.5 килобайт ) Кол-во скачиваний: 313


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Или, наверное, проще вариант, это пройти по листу и посчитать суммы по одинаковым значения форм и вывести внизу рядом с общим итогом.
Так действительно будет проще. Уже потому, что если будешь вставлять суммы в середину таблицы, общий итог будет изменяться.

А вообще, я бы воспользовался не функцией Sum, а функцией SumIf. Смотри:
Прикрепленное изображение

Понимаешь идею? То есть, тебе достаточно на лист забросить несколько (по числу разных форм) ячеек с формулами. Формулы - почти одинаковые, разница - только в среднем поле, для N26 из моего примера, это =SUMIF(B12:B22, M26, N12:N22). А рядом, слева (ну, это уже по желанию, можно и справа smile.gif ) собственно, для какой формы это все считается. Формула одна, результаты - разные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


а как же исключать ячейки и определять начало новых значений


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Когда ж ты сам начнешь думать?

Вот идея прохода по листу с заполнением сумм по формам:
procedure TForm1.Button9Click(Sender: TObject);
const
StrFormula = '=SUMIF(B12:B%d, M%d, N12:N%d)';
var
XLApp : Variant;
Sh : Variant;
start, lastCell, Last : Integer;
prevCell, currCell : string;

begin
XLApp := CreateOleObject('Excel.Application');
XLApp.Visible := True;
XLApp.Workbooks.Open('F:\test\1.xls'); // Это тот файл, который ты высылал первым...

Sh := XLApp.Sheets[2];
LastCell := 25; // Это надо будет вычислить автоматически, но это уже самостоятельно ...

Last := LastCell;

start := 12; prevCell := Sh.Cells[start, 2];
for start := 12 to LastCell - 1 do
begin
currCell := Sh.Cells[start, 2];
if currCell <> prevCell then
begin
Sh.Cells[last + 1, 14].Formula := Format(StrFormula, [LastCell - 1, Last + 1, LastCell - 1]);
Sh.Cells[last + 1, 13] := prevCell;
inc(last);
prevCell := currCell;
end;
end;

// Сохранение отчета ...
XLApp := Unassigned;
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #35


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Благодарю! Выходит даже не обязательно искать эти значения, просто надо выписать уже значения и после просто формулу подставлять. Снова очередная моя невнимательность. а если мне надо два критерия выбора, просто через запятую указать?

Сообщение отредактировано: Atreides -


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Это то есть как 2 критерия? Пример можно привести? Вот есть у меня твой файл, какие 2 критерия ты хочешь добавить для вычисления частичных сумм? Один критерий - понятно, какое-то поле совпадает с нужным значением. Второй какой?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #37


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


По наименованию и по форме. Родилась идея запросом получать записи наименований и форм по distinct, записать их в эксель и к ним уже формулки подписать.

Сообщение отредактировано: Atreides -


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #38


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Я ж просил пример привести... Еще раз: я понимаю, когда у тебя есть один критерий, и ты печатаешь: для формы = "11" сумма = столько_то, для "4У" - столько_то... Как сюда втюхать еще и наименование? Как сумму вычислять, расскажи? Отдельно для разных форм, отдельно для разных наименований - пожалуйста, но это не 2 критерия, а две разные формулы, каждая с одним критерием.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #39


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Под данными надо подвести итоги по суммам и количеству. Итоги считать надо по типу по всем формам с наименованиями не повторяющимися, т.е. Там есть Самара 4У и должна быть Самара 11, так же и с БШШП 4У и БШШП 11. Вот и получается два критерия поиска вычисления сумм


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #40


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


А для комбинирования нескольких условий в Excel есть array formulas, то есть, формулы, работающие с массивами. Пишешь формулу:

Sh.Cells[26, 14].FormulaArray := '=SUM((A12:A22=L26)*(B12:B22=M26)*(N12:N22))';

, и получаешь:
Прикрепленное изображение

Идея понятна, да? Изменяя номера ячеек после знака равенства, получишь все нужные критерии... Если надумаешь проверить как это работает и будешь вводить формул в самом Excel-е, то учти, что array formula вводится не просто Enter-ом, а Ctrl+Shift+Enter...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3 >
 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.05.2024 10:48
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name