为什么我应该在VBA或Excel中使用DIM语句?

Why should I use the DIM statement in VBA or Excel?

所以有一个关于DIM是什么的问题,但是我找不到我为什么要使用它。

据我所知,这三组代码之间没有区别:

1
2
3
4
5
6
7
8
9
'Example 1
myVal = 2

'Example 2
DIM myVal as Integer
myVal = 2

'Example 3
DIM myVal = 2

如果省略DIM,代码仍会运行,并且在2或3个嵌套循环之后,在省略它们时,在输出中看不到任何差异。既然来自于Python,我喜欢保持代码干净*。

那么为什么我需要用DIM声明变量呢?除了风格上的考虑,是否有技术上的原因使用DIM

*我也很懒惰,不习惯声明变量。


未经声明而使用的任何变量都是Variant类型。虽然变体在某些情况下是有用的,但在不需要时应避免使用,因为它们:

  • 较慢
  • 使用更多内存
  • 更容易出错,可能是拼写错误,也可能是分配了错误数据类型的值

  • 使用Dim可以明确代码的意图,并防止常见的错误,如实际声明新变量的拼写错误。如果您在代码中使用Option Explicit On(我完全推荐),Dim将成为强制的。

    下面是一个未能使用Dim导致(潜在的)问题的例子:

    1
    2
    3
    4
    5
    6
    7
    myVar = 100

    ' later on...

    myVal = 10      'accidentally declare new variable instead of assign to myVar

    Debug.Print myVar     'prints 100 when you were expecting 10

    鉴于此代码将使您免于该错误:

    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit

    Dim myVar as Integer
    myVar = 100

    ' later on...

    myVal = 10    ' error: Option Explicit means you *must* use Dim

    有关dim和option explicit的详细信息,请访问:http://msdn.microsoft.com/en-us/library/y9341s4f.aspx


    主持人,我正在努力,假设你们将来会对我给予应有的尊重。

    所有局部变量与所有语言(以及函数的大多数参数)一样存储在堆栈中。当Sub退出时,堆栈将返回到Sub执行之前的状态。所以所有的内存都被释放了。字符串和对象存储在对象管理器或字符串管理器的其他位置,堆栈包含指针,但vb会在释放指针后进行处理。将vbstring(bstr)设置为零长度将释放除两个字节以外的所有字节。这就是为什么我们试图避免全局变量。

    在脚本类型程序中,无类型编程有许多优点。程序很短,使用的变量很少,所以内存和速度不重要-它足够快。随着程序变得越来越复杂,这确实很重要。VB是为无类型编程和类型编程而设计的。对于大多数Excel宏,无类型编程是很好的,而且可读性更高。vbscript只支持无类型编程(您可以将其粘贴到vba/vb6中)。