在过程范围内使用,Dim 关键字声明了一个局部变量。
在一个过程范围内,你只能声明局部变量;局部变量在它们被声明的范围内生死存亡。
如果您需要从多个范围内访问一个变量,您有多种选择:
- 通过将局部变量的声明移动到模块的声明部分,将局部变量提升到全局范围,将关键字更改为
Public:现在所有过程都可以访问该变量范围在所有模块中。这通常是一个相当糟糕的主意。
- 将局部变量提升到模块级别(将其声明移动到模块的声明部分),保留
Dim 关键字或将其更改为Private:现在可以从该模块中的所有过程范围访问该变量。也可能是个坏主意。
请注意 Public 和 Private 关键字(以及已弃用的 Global 关键字)在本地范围内是非法的。
还有其他选项,但在我们研究它们之前,让我们重新看看这个声明:
在“Public Sub PackageDimensionsCalculator()”中这是一些计算的结果。
Sub 过程没有“结果”。 Sub 程序做某事,它们不返回任何结果。我们可以使它实际上以两种方式返回结果:
-
ByRef return:我们可以声明一个ByRef 参数,并用它来“返回”结果:
Public Sub PackageDimensionsCalculator(ByRef outResult As Single)
'...do the calculations...
outResult = ... ' <~ assign the return value before procedure exits!
End Sub
-
将其更改为Function。 Function 过程只有一个目的:接受输入,计算结果,并返回它:
Public Function PackageDimensionsCalculator() As Single
'...do the calculations...
PackageDimensionsCalculator = ... ' <~ assign the return value before procedure exits!
End Sub
现在EvaluateFormatSketch()可以通过调用函数来获取值:
Public Function EvaluateFormatSketch() As Boolean
Dim pckgDimensions As Single
pckgDimensions = PackageDimensionsCalculator
'return a Boolean value by assigning to the function identifier:
EvaluateFormatSketch = pckgDimensions > 0
End Function
或者用ByRef返回:
Public Function EvaluateFormatSketch() As Boolean
Dim pckgDimensions As Single
PackageDimensionsCalculator outResult:=pckgDimensions
'return a Boolean value by assigning to the function identifier:
EvaluateFormatSketch = pckgDimensions > 0
End Function
考虑重命名PackageDimensionsCalculator,使其名称以动词开头,例如CalculatePackageDimensions,指出有一个计算某些东西但不接受任何输入的过程是可疑的。考虑将任何输入重构为参数,让调用者负责获取影响计算的值 - 如果所有输入和依赖项都作为参数传递,该函数将更容易测试/验证(并最终维护/调试)。