【发布时间】:2018-06-27 14:37:19
【问题描述】:
我注意到 Stack Overflow 社区的一些成员会在关闭程序中使用Set Object = Nothing。我能够找到为什么这对 Access 的实例很有用,但是在为 Excel 执行此操作时没有一个令人满意的答案,所以我的问题是
在 VBA 中将对象设置为 Nothing 有什么好处?
在下面的示例代码中,设置我的对象ws 和Test 等于Nothing 是否浪费空间? 否则,如果这样做实际上是一种好的做法,为什么?
Dim ws as Worksheet
Dim Test as Range
Set ws = Sheets(“Sheet1”)
Set Test = ws.Range(“A1”)
'Utilize Test variable (copy, paste, etc)
Set Test = Nothing
Set ws = Nothing
Exit Sub
【问题讨论】:
-
您释放内存并避免错误。通常这是使用加载到内存中的对象(例如用户表单,字典)来执行的。范围、图表、工作簿,我还没有看到在代码执行后它们不会“浪费”的问题。因此,我不明白为什么要使用这些变量。
-
找不到页面@Storax。听起来共识是我可以在这里删除:)
-
VBA 有垃圾收集,所以这应该不是问题......但是......我已经看到当人们忘记退出事物实例时这会导致问题......它们有时会出现继续在后台运行,占用内存。
-
@QHarr VBA 不是垃圾收集,而是引用计数。 理论上,当范围退出时,引用计数会正确耗尽。在实践中......这取决于谁为正在清除的对象编写了库 - 如果它是 VBA 类或主机应用程序中的某些东西(如
Range),请不要打扰。如果它是某个引用类型库中的第 3 方类,它不会受到伤害 - 但它可能是多余的。另外值得注意的是,如果对象是用As New {class-name}声明的,那么将其设置为Nothing没有任何效果。