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?
*我也很懒惰,不习惯声明变量。
- 作为参考,关键字集在VBA中做了什么?
- dim分配内存。通过指定类型,可以指定内存大小(否则它是一个变量,由vb决定的数据类型加上8个字节)。VB将在第一次使用时分配。dim是有效的代码,而不使用dim,后者速度较慢,使用的内存更多。vb有一个旧特性,您可以在其中指定类型,如"A$="a string"(% Integer & Long ! Single # Double $ String @ Currency 中所示。正如其他人提到的,它有双重责任防止拼写错误。
- 同意@phd443322。此外,当您尝试使用特定的数据类型(例如,函数和SUB上的参数、函数返回的值等)时,如果输出不是您期望的数据类型,则可能会捕获错误。这使您能够了解代码的实际功能,并帮助您解决问题。
- 由于没有办法访问free内存,所以我觉得调用它来分配内存很奇怪。另外,我们讨论的是像excel这样的大型程序中的单个变量,一个动态分配的变量是否会使其下降?
- @那么我能看到的最大优势是强制数据输入?
- 我想这取决于你的情况。如果它像你描述的那样简单,那么它可能一点也不重要。但是如果你在更大的范围内工作,其中涉及很多函数和子函数,那么控制你的数据是很有好处的。显式定义数据类型是为我添加的控件。这确实是我的观点,但帮助我减少了意想不到的结果。
- 所有局部变量与所有语言(以及函数的大多数参数)一样存储在堆栈中。当Sub退出时,堆栈将返回到Sub执行之前的状态。所以所有的内存都被释放了。字符串和对象存储在对象管理器或字符串管理器的其他位置,堆栈包含指针,但vb会在释放指针后进行处理。将vbstring(bstr)设置为零长度将释放除两个字节以外的所有字节。这就是为什么我们试图避免全局变量。
- 在脚本类型程序中,无类型编程有许多优点。程序很短,使用的变量很少,所以内存和速度不重要-它足够快。随着程序变得越来越复杂,这确实很重要。VB是为无类型编程和类型编程而设计的。对于大多数Excel宏,无类型编程是很好的,而且可读性更高。vbscript只支持无类型编程(您可以将其粘贴到vba/vb6中)。
- fwiw,示例3不适用于vba。不能在同一行上声明和分配变量。
- @表面上看,你的vba线条看起来像Python,但更多的是在引擎盖下。第一个分配变量。Variant是一个COM包装对象,在构造、分配等过程中会调用Windows API,因此会导致内存和性能开销。同时检查此链接的Variant部分。
- @除非变量是常量或作为可选参数传递,否则rory correct
- @根据定义,常数不是变量。我接受你关于可选参数的观点。
- @Rory我不知道如何解释这个常数不是一个变量,但我会查找它:)
- @我知道它是不变的。:)
- @罗里,这正是我想你会说的:我将variable这个词定义为一个存储(值或引用),而不考虑它是否可以改变。
- @我看你怎么决定。VBA语言规范不一致。;)
- @罗里,我得找到它:)不要为了我自己和你争论,这样我就可以安心地睡觉了;p
- @我的意思是:msdn.microsoft.com/en-us/library/dd361851.aspx
未经声明而使用的任何变量都是Variant类型。虽然变体在某些情况下是有用的,但在不需要时应避免使用,因为它们:
较慢
使用更多内存
更容易出错,可能是拼写错误,也可能是分配了错误数据类型的值
- 如果是@phd443322,我应该在摆姿势之前先阅读评论。我鼓励你把你合理的论点贴出来作为答案。其他人会感激的,即使行动没有。
- +克里斯。另外值得一提的是,有些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
- 抱歉,我在寻找技术原因,我已经澄清了答案。虽然有趣,但它们不能证明所需的其他命令是正确的,也不能用类型而不是值来声明我的"示例2"。
- 因为您从不犯错,也不关心性能,所以不应该声明变量。其他人从编译器的帮助中获益。
- @Mikewoolf给出了一个答案,告诉我Dim如何提高性能-因为到目前为止,我看到了在vb3中分配内存(没有显式的再次释放能力)的声明,这在vb3中是必要的,但现在似乎已经过时了。
- 问题是,你已经得到了一些很好的技术理由来声明你的变量,但是拒绝这些理由是不清楚的极端。变量比int大得多,必须对每个操作进行运行时检查。
- @Mikewoolf唯一描述"变体"的地方是在注释中没有解释。这个问题不是一个"非常好的技术原因",它是一个风格原因,也是一个类型安全原因。但这两个问题都可以通过良好的纪律来解决。带实际解释的最佳技术答案是phd443322关于范围界定和内存释放的评论。
主持人,我正在努力,假设你们将来会对我给予应有的尊重。
所有局部变量与所有语言(以及函数的大多数参数)一样存储在堆栈中。当Sub退出时,堆栈将返回到Sub执行之前的状态。所以所有的内存都被释放了。字符串和对象存储在对象管理器或字符串管理器的其他位置,堆栈包含指针,但vb会在释放指针后进行处理。将vbstring(bstr)设置为零长度将释放除两个字节以外的所有字节。这就是为什么我们试图避免全局变量。
在脚本类型程序中,无类型编程有许多优点。程序很短,使用的变量很少,所以内存和速度不重要-它足够快。随着程序变得越来越复杂,这确实很重要。VB是为无类型编程和类型编程而设计的。对于大多数Excel宏,无类型编程是很好的,而且可读性更高。vbscript只支持无类型编程(您可以将其粘贴到vba/vb6中)。
- dynamic typing与static typing是确切的术语。无类型意味着变量没有类型,这不是真的。