Показать сообщение отдельно
  #5  
Старый 28.02.2017, 20:07
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо большое! Все работает!
Единственное, всплыла плавающая проблема: в процессе выполнения операции возникает ошибка: OLE error 800AC472. Как я понял - это ошибка занятости приложения (Раз на раз не приходится. То есть один раз приложение срабатывает нормально, без ошибок, а в другой раз с ошибкой). Эту ошибку получилось исправить с помощью изменения свойства Visible для создаваемого документа:
Код:
//В начале кода, после открытия шаблона MS Excel
MyDoc.Visible := False;

//В конце кода, после заполнения ячеек MS Excel данными
MyDoc.Visible := True;
Только теперь документ открывается в процессе создания и закрывается, когда выходит ScrollBar (согласно моему коду). Вопрос: есть ли возможность как-то скрыть документ? (чтобы он не появлялся в процессе создания) Может есть какие-то варианты? Это, конечно, не принципиально, но все таки хотелось бы навести красивость. Таймер установлен на 5 секунд (вычислил опытным путем; это время, необходимое для корректного завершения процесса).

Код с обработчиком ScrollBar-а:
Код:
procedure TForm7.Button1Click(Sender: TObject);
  var
  i, j: integer;
  begin
    ProgressBar1.Position:=0;
    Timer1.Enabled:=true;
    MyDoc := CreateOleObject('Excel.Application');
    MyDoc.Workbooks.Add(ExtractFilePath(Application.ExeName)+'Финансовый_отчет.xlt');
    MyDoc.Visible := False;
    MyDoc.Range['D4'] := ComboBox1.Text;
    MyDoc.Range['E6'] := DateTimePicker1.DateTime;
    MyDoc.Range['G6'] := DateTimePicker2.DateTime;
    MyDoc.Range['D10'] := Edit1.Text;
    MyDoc.Range['D12'] := Edit2.Text;
    
// Заполнение ячеек документа Excel
    j:= 1;
    for i := 18 to 39{40} do
     begin
    // Заполнение столбца "Отчетные документы"
      MyDoc.Range['C' + IntToStr(i)]:= StringGrid1.Cells[0,j];
    // Заполнение столбца "Стоимость"
      MyDoc.Range['J' + IntToStr(i)]:= StringGrid1.Cells[1,j];
      Inc(j);
      end;

    MyDoc.Visible := True;
    MyDoc.DisplayAlerts := False;
    MyDoc.ActiveWorkBook.SaveAs(ExtractFilePath(Application.ExeName)+'Финансовый_отчет_'+FormatDateTime('ddmmyyyy_hhmm', Now)+'.xls');
  end;

procedure TForm7.Timer1Timer(Sender: TObject);
  begin
    if ProgressBar1.Position < ProgressBar1.Max then
       ProgressBar1.Position:=ProgressBar1.Position+1
    else
  begin
       Timer1.Enabled:=false;
       ShowMessage('Создание отчета выполнено!');
       ProgressBar1.Position:=0;
       MyDoc.Workbooks.Close;
       MyDoc.Quit;
       MyDoc:=UnAssigned
  end;
end;

Может, у меня где-нибудь есть логическая или системная ошибка?
Ответить с цитированием