VBA Excel файл остается открытым в фоновом режиме - PullRequest
0 голосов
/ 27 августа 2018

В настоящее время я использую модуль в Microsoft Access, чтобы открыть файл Excel и вставить результаты в электронное письмо. Модуль работает правильно, но файл Excel остается открытым в фоновом режиме. Это вызывает проблему, когда я пытаюсь запустить тот же модуль, используя тот же файл.

Файл Excel, который я использую, также автоматически обновляет поле даты, поэтому мне также нужен вызов close для предварительного сохранения файла или игнорирования всплывающего окна сохранения изменений.

Public Function emailPaste(exFile As String, exSheet As String, exRange As String, _
EmailSubject As String, To_Field As String, Optional CC_Field As String)

Dim rng As Range
Dim OutApp As Object
Dim OutMail As Object
Dim ApXL As Object

Set ApXL = CreateObject("Excel.Application")
ApXL.Workbooks.Open (exFile)


Set rng = Nothing
' Only send the visible cells in the selection.

Set rng = Sheets(exSheet).Range(exRange).SpecialCells(xlCellTypeVisible)

'If rng Is Nothing Then
    'MsgBox "The selection is not a range or the sheet is protected. " & _
           vbNewLine & "Please correct and try again.", vbOKOnly
    'Exit Sub
'End If

With ApXL.Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

Call OpenOutlook
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)


With OutMail
    .To = To_Field
    .CC = CC_Field
    .Subject = EmailSubject
    .HTMLBody = "<BODY style=font-size:12pt;font-family:Calibri> The report: " & EmailSubject & " " & _
"is pasted below. <br><br> Please review it and contact me if there are any issues.<br><br> " _
& RangetoHTML(rng) & ""
    ' In place of the following statement, you can use ".Display" to
    ' display the e-mail message.
    .Display
End With
On Error GoTo 0

With ApXL.Application
    .EnableEvents = True
    .ScreenUpdating = True
End With

ApXL.Quit

Set ApXL = Nothing
Set OutMail = Nothing
Set OutApp = Nothing
End Function

Как добавить в конце код, необходимый для сохранения файла Excel, и закрыть его без вмешательства пользователя?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018
  1. Вы должны попытаться сообщить Приложению, что Рабочий лист сохранен как есть.
  2. Затем закройте рабочий лист
  3. Затем попробуйте закрыть приложение.

как то так:

exFile.Sheets(exSheet).Saved = True
exFile.Sheets(exSheet).Close
ApXL.Quit

Или скажите, что не нужно экономить на закрытии ...:

exFile.Sheets(exSheet).Close False
ApXL.Quit

Я бы также предложил, чтобы вы хранили прямую ссылку на Лист, а не неявно вызывали лист через активное окно ...

Что-то вроде

dim wsh as Worksheet
set wsh = exFile.Sheets(exSheet)

тогда вы можете работать с переменной wsh ... более комфортно

0 голосов
/ 27 августа 2018

Вы должны быть очень строгими, открывая объекты Excel и закрывая их в обратном порядке - как это сделано в этом примере:

Public Sub RenameWorkSheet()

    Dim xls     As Excel.Application
    Dim wkb     As Excel.Workbook
    Dim wks     As Excel.Worksheet

    Set xls = New Excel.Application
    Set wkb = xls.Workbooks.Open("c:\test\workbook1.xlsx")
    Set wks = wkb.Worksheets(1)

    wks.Name = "My New Name"
    wkb.Close True

    Set wks = Nothing
    Set wkb = Nothing

    xls.Quit

    Set xls = Nothing

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...