Я видел много предложений по этой проблеме, и я пробовал их все, но ни один из них не работает. Код VBA находится в продукте, отличном от Microsoft (SAP Business Objects, что может быть проблемой). Я создать объект Excel:Автоматизация VBA Excel оставляет процесс в памяти после выхода
Set oExcel = CreateObject("Excel.Application")
загружать содержимое из колонны 1 одного из листов в конкретной книге, затем закройте Excel. Каждый раз он оставляет процесс в памяти, занимая 5 МБ памяти.
Я попытался сделать объект oExcel видимым, чтобы по крайней мере я мог его убить, не прибегая к диспетчеру задач, но когда я вызываю Quit, пользовательский интерфейс завершает работу и все еще покидает процесс.
Каждый раз, когда я запускаю код, он создает новый процесс. Так что я пытался повторно использовать существующие процессы Excel, вызвав
Set m_oExcel = GetObject(, "Excel.Application")
и создаёт его, если этот вызов не возвращает ничего,
Это не пролиферируют процессы, но единый процесс вырос на 5+ мб каждый раз, по сути, та же проблема.
В каждом случае я закрываю книгу, я открыл и поставил DisplayAlerts в Ложные перед выходом:
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' –
hmmmm Я играю с этим и 'Set m_oExcel = Nothing 'освобождает его из диспетчера задач * каждый раз *; даже если я не делаю 'm_oExcel.Quit'. На самом деле, даже если я не устанавливаю его в Nothing, диспетчер задач удаляет этот процесс после выполнения. –