【问题标题】:How to release an Aspen object and clear memory如何释放 Aspen 对象并清除内存
【发布时间】:2018-03-11 00:12:58
【问题描述】:

这是我第一次使用这样的论坛。 我有和这里完全相同的问题: 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 个),但仍有大量内存在积累。

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

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

【问题讨论】:

    标签: excel vba object memory aspen


    【解决方案1】:

    如果.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 放在循环的外部,并在每次打开新文件时使用相同的对象。

    【讨论】:

    • 非常感谢@K.DAVIS 快速回复您的想法。我尝试了他们两个。退出第二个 sub 时,将 subs 拆分为 2 并没有释放内存。总而言之,将“Set ObjEDR”置于循环之外会有所帮助(内部循环 = 增加 36MB 内存,外部循环 = 增加 66MB 内存)。但是,内存没有被释放。 '.Quit' 或 '.Close' 遗憾地不适用于该对象。我发布的代码在一个函数中,这有什么区别吗?此外,“Set ObjEDR = New BJACApp”行添加的内存远少于“If Not ObjEDR.FileOpen(Path) Then”...
    【解决方案2】:

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

    ObjEDR.dispose()

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

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2016-11-27
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      相关资源
      最近更新 更多