【问题标题】:VBA How to clear object before Exit Sub within With Object statement [duplicate]VBA如何在With Object语句中退出Sub之前清除对象[重复]
【发布时间】:2020-07-31 15:00:31
【问题描述】:

我在With 语句中使用了Exit Sub 来避免下面代码中的Set 语句。这会清除对象还是有办法做到这一点?

Dim FolderPathStr As String
With CreateObject("Scripting.FileSystemObject")
  If .FolderExists(FolderPathStr) = False Then
    MsgBox "Folder does not Exist"
    Exit Sub
  End If
End With

【问题讨论】:

  • 不知道你所说的“清除对象”是什么意思,但是VBA是垃圾收集的,应该没有问题。
  • @JohnColeman - 我很确定(在多次听到 Mathieu Guindon 以及 here 之后),VBA 是引用计数的,而不是垃圾收集的。
  • @BigBen 引用计数是管理垃圾收集的一种可能方式。
  • 我想我们只是在谈论语义然后哈哈。
  • @BigBen 重点是,与需要显式释放内存的 C 语言不同,VBA 运行时会自动为您完成。与使用 VBA 的大多数事情一样,它的方法是 1990 年代的技术,因此它当然没有最先进的垃圾收集。

标签: vba


【解决方案1】:

正如 cmets 所说,VBA 具有自动垃圾收集功能。这意味着当 VBA 运行时确定不再使用某个对象或变量时,它可能会释放该对象或变量。

在您的示例中,一旦到达 End With 语句,就无法再访问 Scripting.FileSystemObject 对象,因此 VBA 可能会在那里释放该对象。

您是否已将创建的对象分配给对象变量,那么有两种方法可以或将要释放该对象。示例:

Sub Example

    Dim myObject As Object
    Set myObject = CreateObject("Scripting.FileSystemObject")
    '
    ' ...whatever you want to do with it...
    '
    Set myObject = Nothing    ' explicit release of the object

End Sub                       ' implicit release of the object

对象的显式释放通过程序员命令释放对象。如果在不再需要对象的地方仍然进行工作,这可能会很有用,因为它可能会减少程序的资源需求

对象的隐式释放发生在 Sub 的末尾,因为对象变量不再存在 - VBA 释放变量释放其对象。

【讨论】:

  • VBA 中根本没有垃圾收集。对象的销毁是完全确定的,并且基于COM reference count
  • @GSerg,我了解引用计数。文件系统对象可以分为两部分(我不确定)。一个“用户级别”部分,在用户使用它时维护状态(例如,当前设置的工作目录、文件规范等),以及一个系统级别部分。引用计数可能发生在两个级别上。用户级别可以像我上面描述的那样被释放。当不再有客户端部件连接到系统部件时,可以通过引用计数释放系统级别。但是这样的描述会超出对这个用户有帮助的简单解释。
猜你喜欢
  • 1970-01-01
  • 2012-06-27
  • 2020-01-06
  • 2012-05-01
  • 2019-03-04
  • 2012-09-27
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多