这是我第一次使用这样的论坛。我有和这里完全一样的问题:How to release an object and clear memory in VBA
在这个帖子中,不幸的是这个问题没有得到解决。
使用Excel VBA我连接到另一个程序(即Aspen EDR)。为此,我安装了一个相应的插件。要访问Aspen EDR,我需要添加一个对象。完成后,我想释放对象以节省一些内存。我尝试的第一件事是:
Dim ObjEDR As BJACApp
Dim Path As String
Path = 'assume this is the correct path to the file i want to open
Set ObjEDR = New BJACApp ' Create the BJAC object
If Not ObjEDR.FileOpen(Path) Then
MsgBox "Can't open file!"
End If
'...
Set ObjEDR = Nothing在我将对象设置为nothing之后,Excel不会释放内存(正如我在任务管理器中看到的那样)。当然,在几百次迭代之后(我必须打开很多这样的文件),我得到了一条错误消息,即Excel内存不足。我读了几个线程,显然没有什么东西只删除对对象的某种引用,而不是对象本身,所以我尝试添加fileclose
'...
ObjEDR.FileClose
Set ObjEDR = Nothing在执行FileClose时,我可以看到释放了一些内存(3MB的0.5),但仍然有大量的内存在积累。
此外,当不使用"Now“时,它不工作,并且在执行Set ObjEDR = BJACApp时,我得到”运行时错误‘424’:需要对象“
我还读到了一些“指针”,它们可能会导致驻留内存增加,但是我如何才能找到并清除/删除它们呢?有谁有主意吗?我真的很感激!
发布于 2018-03-11 08:47:25
如果.Quit (或对象的等价物)和将对象设置为Nothing对您不起作用,那么您可以尝试依靠VBA的垃圾收集器来完成这项工作。
从本质上讲,这意味着您需要将子对象一分为二,拥有主子对象,并在该子对象中调用将打开和关闭对象的子对象。希望在第二个子对象退出时,VBA将清理这些对象。
Sub Main()
Dim filePath As String
For Each [..] In [..] ' Or use a Do...Loop
filePath = 'assume this is the correct path to the file i want to open
openObj filePath 'call the sub below
Next [..]
End Sub
Sub openObj(ByVal Path As String)
Dim ObjEDR As BJACApp
Set ObjEDR = New BJACApp ' Create the BJAC object
If Not ObjEDR.FileOpen(Path) Then
MsgBox "Can't open file!"
End If
[...] 'your code to perform the needed actions with your obj
ObjEDR.FileClose
Set ObjEDR = Nothing
End Sub我对这个对象一无所知,但您也应该尝试一下.Quit和.Close
另一种方法是,而不是为每个路径创建新对象。将Set ObjEDR放在循环的之外的上,并在每次打开新文件时使用相同的对象。
发布于 2018-03-16 16:19:15
好的,对于那些感兴趣的人: Aspen Tech的支持告诉我
ObjEDR.dispose()
应该可以工作,但只适用于V8.4以上的版本。
https://stackoverflow.com/questions/49215343
复制相似问题