为什么我真的应该在 VBA 中标注我的变量?

Why should I dimension my variables in VBA really?

他们过去常说这是关于内存管理的。 但是,看一看我发现无法对变量进行维度标注会将其默认为分配 22 字节内存的变体数据类型。

让我们只考虑一兆字节的内存。 1,000,000 字节。 这意味着我需要 45,454 个变量来消化 1 MB 的内存。大多数现代系统都有几 GB 的内存。所以问题是我真的应该关心为所有变量仔细设置正确的暗淡吗?或者按照现代标准,这是浪费时间吗?

我发现的最有帮助的原因是能够立即查看什么是变量和什么是控件(这在 Access 中比 Excel 更重要),并且只知道什么是很好的它真正应该是的变量类型。这对于查看您的代码的其他人非常有用,因为我继承了一些根本没有定义变量的项目,以及定义非常好的变量的项目,而后者无疑使事情变得容易得多。不过,关于内存,我不会说这无关紧要,但差异可以忽略不计,所以这是个人选择。

内存使用只是令人愉快的副作用。我建议使用 Option Explicit 的真正原因是它允许编译器保护您免受编译和 运行 的编码错误,但不要按照您的意图进行。

示例1:防止错别字演变成意想不到的灾难。

Dim variableNamedFoobar As String
variableNamedFoobar = "Something"

If varableNamedFoobar <> "Something" Then
    Debug.Print "Did you catch that? The compiler would..."
End If

如果您没有显式声明变量,编译器会很乐意为您提供一个 22 字节的空字符串进行比较。

示例 2: 它还可以防止范围泄漏。考虑一个具有多级可变范围的大型项目。希望你记得你的全局变量是什么:

Private x As Integer

Private Sub First()
    'I remembered here that x is a global.
    x = 2
    Debug.Print x
    Second
    Debug.Print x
End Sub

Private Sub Second()
    'I forgot here.
    For x = 1 To 5
    Next x
End Sub

添加 Dim x as Integer 用作循环计数器可确保其范围为 Second()

示例 3: 它允许编译器检测类型不匹配。

Set foo = New Collection
foo.Add "Bar"
Debug.Print TypeName(foo)

'... 100 lines of code later...

foo = 6
Debug.Print TypeName(foo)

如果你在某个地方有 Dim foo As Collection,你会得到一个编译时错误,让你知道你已经 一个 foo 而你不应该不要给它分配 6。

还有许多其他示例可以说明您可以使用隐式变量声明搬起石头砸自己的脚(或更高)。虽然这些示例很容易在上面的代码块的隔离中发现,但它们中的任何一个都可能在大型代码库中导致细微且极难调试的错误。帮自己(以及以后可能需要维护您的代码的每个人)一个忙,输入额外的代码行。