Спасибо большое! Все работает!
Единственное, всплыла плавающая проблема: в процессе выполнения операции возникает ошибка:
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;
Может, у меня где-нибудь есть логическая или системная ошибка?