0

这是我第一次使用这样的论坛。我有和这里完全相同的问题: 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

在我没有设置对象后,Excel 不会释放内存(正如我在任务管理器中看到的那样)。当然,经过几百次迭代(我必须打开很多这些文件)我收到一条错误消息,即 Excel 内存不足。我读了几个线程,显然没有什么只会删除对对象的某种引用而不是对象本身,所以我尝试添加 fileclose

'...

ObjEDR.FileClose
Set ObjEDR = Nothing

执行 FileClose 时,我可以看到释放了一点内存(3MB 中的 0.5 个),但仍然有很多内存在积累。

此外,当不使用“现在”时,它不起作用,并且在执行 Set ObjEDR = BJACApp 时出现“运行时错误'424':需要对象”

我还阅读了可能导致停留内存增加的“指针”,但我怎样才能找到并清除/删除它们?有人有想法吗?我真的很感激!

4

2 回答 2

0

好的,有兴趣的人:Aspen Tech 的支持告诉我

ObjEDR.dispose()

应该可以工作,但仅适用于 V8.4 以上的版本。所以这并没有解决我的问题,我使用 MATLAB 构建了一个解决方法,它在每次运行后打开和关闭 Excel。所以我打开和关闭 Excel 文件的时间很慢,但是 excel 的内存在停止工作之前不会增加。

于 2018-03-16T08:19:14.923 回答
0

如果.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-11T00:47:24.553 回答