Excel VBA - 在何处声明有条件使用的多用途变量

时间:2016-01-24 08:38:37

标签: excel-vba memory-management vba excel

第一个问题,请温柔。自从我开始编写和编辑代码以来,SO对我非常有帮助,所以我希望能够做出贡献。

我试图简化(尽可能)一个程序,它逐行重复执行大量检查(用户输入是多行)。因此问题特别是:对于重复运行的子(由另一个多次调用),我应该声明其变量1)全局 - ,即使它们实际上可能不是使用 - 2)私有地在相关子的开头,或3)一旦程序确定条件需要他们私下?

1)将是:

Public VBase as Integer, VTop as Integer, VAWX as Boolean

对于2)和3),区别在于VBaseVTop,2):

Sub XVolcanicAsh()
    Dim VBase as Integer, VTop as Integer, VAWX as Boolean
    ' <snip all the code>
End Sub

并且3)存在:

Sub XVolcanicAsh()
    Dim VAWX As Boolean 'this one's always used regardless
    For ROW = 5 To NUMLINE + 4
        ' <snip code involving VAWX>
        If Sheets("QA").Cells(ROW, 31).Value = "" Then
            ' the variables won't be used because the cell's blank
        Else
            Dim VBase As Integer, VTop As Integer
            VBase = Mid(Sheets("QA").Cells(ROW, 31).Value, 3, 3)
            VTop = Right(Sheets("QA").Cells(ROW, 31).Value, 3)
            ' <snip other code>
        End If
    Next ROW
End Sub

这个特定实例的问题不如清理整个程序的模板,因为当前声明的很多全局变量只能在少数行中使用 - 但包含它们的subs通常称为多个次。

我在这里理解的程度是1)将变量保存在内存中直到主子结束,而2)和3)将在子结束后转储它们;并且3)可以多次标注它们。 (我仍然不清楚精确的后果,但到目前为止它并没有给我带来错误。)

在1),2)和3)之间是否存在性能方面的显着差异?哪个(如果有的话)是最好的编码实践?也许我的搜索技能不是他们应该做的,但Google和SO的内部搜索都没有给我一个正确的答案。

1 个答案:

答案 0 :(得分:1)

在VBA(和VB6)中,内存管理是通过寄存器完成的,而不是说代际垃圾收集器,所以你不会注意到任何性能方面,重要的是变量的范围。你知道变量在内存中的存在时间是正确的。

一个好的编码规则(编码语言不可知)是将变量保持在它们使用的范围内。

例如,在VBA中使用模块进行全局范围是非常常见的,尽管它通常最终会出现“程序编程”(spaghetti code)。我见过一些巨大的&amp;具有千行函数的杂乱电子表格全部使用全局变量。呃。

你希望通过封装,重构和扩展来养成使用类的习惯。重用通用/抽象/多态方法,尽可能避免使用公共范围。

学会写整洁&amp;在进行优化之前,结构良好的代码。

谷歌这句话:“过早优化是万恶之源。”