【发布时间】:2017-10-11 13:19:19
【问题描述】:
我已经看到了很多关于这个问题的建议,并且我都尝试了它们,但似乎没有一个有效。 VBA 代码位于非 Microsoft 产品中(SAP Business Objects,这可能是问题所在)。我创建了一个 Excel 对象:
Set oExcel = CreateObject("Excel.Application")
从特定工作簿中的一个工作表的第 1 列加载内容,然后关闭 Excel。每次,它都会在内存中留下一个进程,占用 5+ mb 的内存。
我尝试让 oExcel 对象可见,这样至少我可以在不借助任务管理器的情况下将其杀死,但是当我调用 Quit 时,UI 退出,并且仍然离开进程。
每次我运行代码时,它都会创建一个新进程。所以我尝试通过调用
来重用任何现有的 Excel 进程Set m_oExcel = GetObject(, "Excel.Application")
并且仅在该调用不返回任何内容时创建它,
这并没有增加进程,但是单个进程每次增长 5+ mb,所以本质上是相同的问题。
在每种情况下,我都会关闭我打开的工作簿并将 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
【问题讨论】:
-
我认为任务管理器对于这类事情是出了名的不可靠......我认为这里还有其他关于类似主题的 Q,并且一致认为 TM 是不正确的。让我看看能不能确认一下。
-
尝试将
m_oBook.Close SaveChanges:=False改为m_oBook.Saved = True -
hmmmm 我正在玩这个,
Set m_oExcel = Nothing每次都会从任务管理器中释放它;即使我不做m_oExcel.Quit。事实上,即使我不将其设置为 Nothing,任务管理器也会在运行时删除该进程。 -
Set oExcel = CreateObject("Excel.Application")在任务管理器中)。一旦你知道哪一行没有做你想做的事,然后只用相关代码编辑你的帖子。 -
您确定您正在查看任务管理器中的进程而不是应用程序吗?我正在单步执行它并立即调用 CreateObject() 它出现在 Processes 中。