Закрытие Excel из Delphi

Помог бы кто-нибудь с тем, что я уверен, является основной ошибкой с моей стороны, пожалуйста.

Моя цель – открыть электронную таблицу Excel (невидимо), заполнить ее, прикрепить ее к электронной почте, отправить и закрыть все.

Он близок к завершению, за исключением того, что Excel остается открытым – в Диспетчере задач – после завершения процесса.

Блок кода:

procedure TFMain.SendEmail; var i, j, r: Integer; vBody, vSaveVer: string; vAttach: TIdAttachment; vMftQty: array [1 .. 2] of Integer; vQtyTot: array [1 .. 12] of Integer; vNetTot: array [1 .. 12] of Real; oXL, oWB, oSheet: Variant; begin IdMessage1.From.Address := '[email protected]'; IdMessage1.From.Domain := 'valid-email.co.uk'; IdMessage1.From.Text := 'Sage <[email protected]>'; IdMessage1.Subject := 'Sage'; try SQLQuery1.Close; SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add('SELECT comp,dept,e_addr FROM acc_email WHERE dept="' + EMailQuery.FieldByName('Dept').Text + '"'); SQLQuery1.Open; while not SQLQuery1.Eof do begin IdMessage1.Recipients.EMailAddresses := EMailQuery.FieldByName('E_Addr').Text; SQLQuery2.Close; SQLQuery2.SQL.Clear; SQLQuery2.SQL.Add('SELECT * FROM invoice WHERE global_dept_number="' + EMailQuery.FieldByName('Dept').Text + '" ORDER BY account_ref, stock_code'); SQLQuery2.Open; oXL := CreateOleObject('Excel.Application'); oXL.DisplayAlerts := False; oWB := oXL.Workbooks.Add; while not SQLQuery2.Eof do begin oXL.Cells[r, 1].Value := 'Code'; oXL.Cells[r, 2].Value := 'Description'; oXL.Cells[r, j * 2 + 1].Value := 'Qty'; oXL.Cells[r, j * 2 + 2].Value := 'Value'; Inc(r); oWB.Worksheets.Add(After := oWB.Worksheets[oWB.Worksheets.Count]); oSheet := oWB.ActiveSheet; oSheet.Name := SQLQuery2.FieldByName('account_ref').Text; oXL.Cells[1, j * 2 + 1].Value := 'Month'; r := 2; SQLQuery2.Next; end; if oWB.Worksheets.Count > 1 then oWB.Worksheets.Item['Sheet1'].Delete; oWB.Worksheets[1].Select; oWB.SaveAs(vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx'); SQLQuery1.Next; end; try if IdMessage1.Recipients.EMailAddresses <> '' then begin vAttach := TIdAttachmentFile.Create(IdMessage1.MessageParts, vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx'); IdSMTP1.Connect; IdSMTP1.Send(IdMessage1); IdMessage1.Recipients.EMailAddresses := ''; IdMessage1.Body.Text := ''; end; finally if IdSMTP1.Connected then IdSMTP1.Disconnect; end; finally vAttach.Free; oSheet := Unassigned; oWB := Unassigned; oXL.Quit; oXL := Unassigned; end; end; 

Однако Excel остается в диспетчере задач, и, поскольку процесс выполняется несколько раз в течение дня, они создаются в фоновом режиме.

Может ли кто-нибудь направить меня к решению или как устранить проблему?

Возможно, ваша книга не закрывается при закрытии Excel. Если ваши книги уже сохранены, вы можете закрыть их с помощью Workbook.Close; В противном случае вы можете пометить книги как сохраненные до их закрытия (Workbook.Saved: = True), или когда вы их закроете, вы можете закрыть их:

Workbook.Close (False);

Ложный аргумент говорит рабочей книге закрываться без запроса сохранения. Когда все рабочие книги будут закрыты, Excel должен выйти из строя должным образом.

Interesting Posts

Как изменить стиль границы на несколько ячеек сразу. NPOI

Изменение фильтра сводной таблицы с использованием VBA

NumberFormat работает, но значения все еще разные

Исправить ошибку времени выполнения '91: объектная переменная или с переменной Block не установлена

Создайте новый список, игнорируя многочисленные критерии в excel

Выделение ячеек на основе некоторых столбцов и строк, относящихся к определенным критериям, к другой таблице

ExcelAsyncUtil.Observe – создание рабочих часов в Excel

Кнопка Excel в нескольких группах работает как одна группа

Редактирование значений в Excel

Как вернуть уникальный список, содержащий строку?

Looped If / Then Функции в Excel VBA

условный формат, основанный на смежной таблице соседей

Избегайте вставки дубликатов в MySQL при чтении файла excel с использованием весенней загрузки

Как создать автоматический динамический линейный граф в Excel VBA

Чтение из файла excel с использованием oledb – пустые строки

Давайте будем гением компьютера.