Excel 将对象设置为“有什么好处?”;“什么都没有”;

Excel 将对象设置为“有什么好处?”;“什么都没有”;,excel,vba,Excel,Vba,我注意到Stack Overflow社区的一些成员将在关闭过程中使用Set Object=Nothing。我能够找到为什么这对Access实例很有用,但对于Excel来说,没有一个答案是令人满意的,所以我的问题是 在VBA中将对象设置为空有什么好处? Dim ws as Worksheet Dim Test as Range Set ws = Sheets(“Sheet1”) Set Test = ws.Range(“A1”) 'Utilize Test variable (copy

我注意到Stack Overflow社区的一些成员将在关闭过程中使用
Set Object=Nothing
。我能够找到为什么这对Access实例很有用,但对于Excel来说,没有一个答案是令人满意的,所以我的问题是 在VBA中将对象设置为空有什么好处?

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 
在下面的示例代码中,将我的对象
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 

如果这是托管的.NET代码(垃圾收集),那么您必须
释放您访问过的每个COM对象,以免主机进程(EXCEL.EXE)可能仍在后台运行,占用内存,无法完全崩溃

但这是VBA代码(引用计数),而且是使用宿主应用程序控制的对象的VBA代码-当宿主应用程序关闭时,这些对象将消失,而当这种情况发生时,VBA执行上下文早已消失

换句话说,所有这些
Set…=没有任何指令是完全冗余的


在某些特定情况下,当您处理第三方API/类型库时,对象可能不会完全清除。例如,您可能正在创建一个
Access.Application
实例,并发现在Excel退出后,任务管理器中的“ghost”Access.EXE进程仍处于打开状态:这表明您不知何故在某处泄漏了对象引用,并且
Set…=没有任何东西可以阻止这种情况

但是,我不建议系统地取消所有对象引用。只有当不这样做会导致问题时。即使这样,也会有一两个物体把所有东西都拖下来,而不是全部。如果ACCESS.EXE正确关闭,就没有理由用这些指令来混乱代码


避免在全局状态中存储对象引用也有帮助。如果一切都是局部的,理论上,一旦局部作用域退出,所有涉及的对象都将被销毁。

释放内存并避免错误。通常,这是通过加载到内存中的对象(例如,用户表单、字典)执行的。范围、图表、工作簿,我还没有看到它们在代码执行后不会被“浪费”的问题。因此,我不明白为什么要使用这些变量。在大多数情况下,您不需要这样做。查找@Storax未找到的讨论或页面。听起来大家一致认为我可以在这里删除:)VBA有垃圾收集,所以这应该不是问题。。。。然而。。。。。我见过当人们忘记放弃某件事情时,这会导致问题。。。它们有时似乎一直在后台运行,占用内存。@QHarr VBA不是垃圾收集,而是引用计数。理论上,当作用域退出时,refcount会适当耗尽。实际上。。。这取决于谁为要清除的对象编写了库-如果它是VBA类或宿主应用程序中的某个类(如
范围
),请不要麻烦。如果它是某个引用类型库中的第三方类,它不会有什么坏处,但它可能是多余的。同样值得注意的是,如果对象是用
声明为新的{class name}
,那么将其设置为
Nothing
没有任何效果。谢谢您的清理。我一直在看,开始怀疑我不这么做是否犯了新手的错误。Set Nothing的所有实例都已删除!那么,这如何适用于IE实例呢?例如,当编码人员还没有退出应用程序时,即使超出范围,也会导致PC停止运行。这是进程与对象之间的区别吗?@QHarr我在VBA中不做IE之类的事情,但如果我做了,我可能会用
块将实例封装在
中,例如,用新的InternetExplorer
或不管类名是什么:当
块拥有实例时,当到达
结束时,对象就会死亡。Ok。谢谢。这是一个关于
块的非常好的注释