variables - 何时应终止 Excel VBA 变量或将其设置为 Nothing?

标签 variables excel vba

过去两年我一直在自学 Excel VBA,我认为有时在代码段末尾处理变量是合适的。例如,我已经看到它在改编自Ron de Bruin's code for transferring Excel to HTML的这一点中完成了。 :

Function SaveContentToHTML (Rng as Range)

        Dim FileForHTMLStorage As Object
        Dim TextStreamOfHTML As Object
        Dim TemporaryFileLocation As String
        Dim TemporaryWorkbook As Workbook

...

        TemporaryWorkbook.Close savechanges:=False
        Kill TemporaryFileLocation
        Set TextStreamOfHTML = Nothing
        Set FileForHTMLStorage = Nothing
        Set TemporaryWorkbook = Nothing

End Function

我对此进行了一些搜索,除了如何做到这一点之外几乎没有发现什么,在一篇论坛帖子 a statement that no local variables need to be cleared 中,因为它们在 End Sub 处不再存在。根据上面的代码,我猜测在 End Function 或我没有遇到过的其他情况下可能不是这样。

所以我的问题归结为:

  • 网络上是否有某个地方解释了变量清理的时间和原因,但我还没有找到?

如果没有,请有人解释一下......

  • 何时需要对 Excel VBA 进行变量清理,何时不需要?
  • 更具体地说...是否有特定的变量用途(公共(public)变量? 函数定义的变量?)在内存中加载的时间更长 比潜艇做的,因此如果我不清洁可能会造成麻烦 追随我自己?

最佳答案

VB6/VBA 使用确定性方法来销毁对象。每个对象都存储对其自身的引用数量。当数字达到零时,该对象将被销毁。

当对象变量超出范围时,保证被清除(设置为Nothing),这会减少各自对象中的引用计数器。无需手动操作。

只有两种情况需要显式清理:

  1. 当您希望在其变量超出范围之前销毁对象时(例如,您的过程将需要很长时间才能执行,并且该对象拥有资源,因此您希望将对象销毁为尽快释放资源)。

  2. 当两个或多个对象之间存在循环引用时。

    如果objectA存储对objectB的引用,并且objectB存储对objectA的引用,则这两个对象除非您通过显式设置 objectA.ReferenceToB = NothingobjectB.ReferenceToA = Nothing 来中断链,否则永远不会被销毁。

您显示的代码片段是错误的。无需手动清理。进行手动清理甚至是有害的,因为它会给你一个 false sense of more correct code .

如果您在类级别有一个变量,则当类实例被破坏时,它将被清除/销毁。如果需要,您可以提前销毁它(请参阅第 1. 项)。

如果您在模块级别有一个变量,那么当您的程序退出时(或者,如果是 VBA,当 VBA 项目重置时),它将被清除/销毁。如果需要,您可以提前销毁它(请参阅第 1. 项)。

变量的访问级别(公共(public)与私有(private))不会影响其生命周期。

关于variables - 何时应终止 Excel VBA 变量或将其设置为 Nothing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19038350/

相关文章:

php - 为什么当打开 PHPExcel 生成的 xls 文件然后单击保存时大小减小?

excel - Instr 函数未找到子字符串

excel - 为什么 SendKey Enter 不能与 Chrome 浏览器一起使用

vba - 循环遍历行和列 Excel 宏 VBA

excel - 通过 VBA 宏打开 MS Excel 时禁用 "update links message"

web-services - 在 Excel 中使用 Web 服务并部署为一个文件

java - 使用一个java类的变量到另一个java类

c - 为什么C变量的最大值和最小值会接触?

sql-server - 如何在数据流任务SSIS 2008 r2中传递变量

javascript - 将变量与 window.location.href 一起使用