Я видел много предложений по этой проблеме и перепробовал их все, но, похоже, ни один из них не работает. Код VBA находится в продукте стороннего производителя (SAP Business Objects, что может быть проблемой). Создаю объект Excel:
Set oExcel = CreateObject("Excel.Application")
Загрузите содержимое из столбца 1 одной из рабочих таблиц в конкретную книгу, затем закройте Excel. Каждый раз он оставляет процесс в памяти, занимая более 5 МБ памяти.
Я попытался сделать объект oExcel видимым, чтобы, по крайней мере, я мог убить его, не прибегая к диспетчеру задач, но когда я вызываю Quit, пользовательский интерфейс завершает работу и все еще оставляет процесс.
Каждый раз, когда я запускаю код, он создает новый процесс. Поэтому я попытался повторно использовать любые существующие процессы Excel, вызвав
Set m_oExcel = GetObject(, "Excel.Application")
и создавать его только в том случае, если этот вызов ничего не возвращает,
Это не увеличивало количество процессов, но один процесс увеличивался каждый раз на 5+ МБ, так что, по сути, та же проблема.
В каждом случае я закрываю открытую книгу и устанавливаю для DisplayAlerts значение False перед выходом:
m_oBook.Close SaveChanges:=False
m_oExcel.DisplayAlerts = False
m_oExcel.Quit
Этот фрагмент кода использовался как минимум пять лет, но эта проблема не возникала до тех пор, пока мы не перешли на Windows 7.
Вот полный код на случай, если это поможет. Обратите внимание, что все объекты Excel являются переменными уровня модуля (префикс «m_») для одного предложения, и я использовал правило «одной точки» для другого предложения. Я также пробовал использовать общие объекты (т.е. позднюю привязку), но это тоже не решило проблему:
Private Function GetVariablesFromXLS(ByVal sFile As String) As Boolean
On Error GoTo SubError
If Dir(sFile) = "" Then
MsgBox "File '" & sFile & "' does not exist. " & _
"The Agent and Account lists have not been updated."
Else
Set m_oExcel = CreateObject("Excel.Application")
Set m_oBooks = m_oExcel.Workbooks
Set m_oBook = m_oBooks.Open(sFile)
ThisDocument.Variables("Agent(s)").Value = DelimitedList("Agents")
ThisDocument.Variables("Account(s)").Value = DelimitedList("Accounts")
End If
GetVariablesFromXLS = True
SubExit:
On Error GoTo ResumeNext
m_oBook.Close SaveChanges:=False
Set m_oBook = Nothing
Set m_oBooks = Nothing
m_oExcel.DisplayAlerts = False
m_oExcel.Quit
Set m_oExcel = Nothing
Exit Function
SubError:
MsgBox Err.Description
GetVariablesFromXLS = False
Resume SubExit
ResumeNext:
MsgBox Err.Description
GetVariablesFromXLS = False
Resume Next
End Function
m_oBook.Close SaveChanges:=False
наm_oBook.Saved = True
- person Dmitry Pavliv   schedule 22.01.2014Set m_oExcel = Nothing
освобождает его из диспетчера задач каждый раз; даже если я этого не сделаюm_oExcel.Quit
. Фактически, даже если я не установил для него значение «Ничего», диспетчер задач удалит процесс после выполнения. - person David Zemens   schedule 22.01.2014Set oExcel = CreateObject("Excel.Application")
‹- не создает процесс Excel.Exe в диспетчере задач. Попробуйте выполнить пошаговый код, чтобы увидеть, когда экземпляр действительно запускается, а затем посмотрите на свой код, проходя пошагово, и выясните, в какой момент вы хотите убить экземпляр (в диспетчере задач). Как только вы узнаете, какая строка не выполняет то, что вы хотите, отредактируйте сообщение, используя только соответствующий код. - person   schedule 23.01.2014