第一个问题,请温柔。自从我开始编写和编辑代码以来,SO对我非常有帮助,所以我希望能够做出贡献。
我试图简化(尽可能)一个程序,它逐行重复执行大量检查(用户输入是多行)。因此问题特别是:对于重复运行的子(由另一个多次调用),我应该声明其变量1)全局 - ,即使它们实际上可能不是使用 - 2)私有地在相关子的开头,或3)一旦程序确定条件需要他们私下?
1)将是:
Public VBase as Integer, VTop as Integer, VAWX as Boolean
对于2)和3),区别在于VBase
和VTop
,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的内部搜索都没有给我一个正确的答案。
答案 0 :(得分:1)
在VBA(和VB6)中,内存管理是通过寄存器完成的,而不是说代际垃圾收集器,所以你不会注意到任何性能方面,重要的是变量的范围。你知道变量在内存中的存在时间是正确的。
一个好的编码规则(编码语言不可知)是将变量保持在它们使用的范围内。
例如,在VBA中使用模块进行全局范围是非常常见的,尽管它通常最终会出现“程序编程”(spaghetti code)。我见过一些巨大的&amp;具有千行函数的杂乱电子表格全部使用全局变量。呃。
你希望通过封装,重构和扩展来养成使用类的习惯。重用通用/抽象/多态方法,尽可能避免使用公共范围。
学会写整洁&amp;在进行优化之前,结构良好的代码。
谷歌这句话:“过早优化是万恶之源。”