在VBA中,所有变量都以变体类型开头

时间:2013-10-17 07:09:35

标签: excel vba excel-vba office-2010

引用我的同事:

  

VBA中的所有变量都是变体,但具有不同的vartype:

Dim x      '--->variant with vartype = vbEmpty  
x= "hello" '--->vartype changed from vbEmpty to vbString and value assigned  
x= 1       '--->vartype  changed to vbInteger
     
Dim x as String  '--->variant with vartype = vbEmpty is created and then vartype changed to vbString  
x= "hello"       '--->vartype = vbString  
x=1              '--->because x was declared explicitly with String it will try to implicitly convert 1 to string, so, x will remain vbString

我的主要争论点是Dim x as String如何适应他all variables in VBA are variants的陈述。变体的效率更低,所以为什么一切都从那里开始并被转换。

VBA中的所有变量都是变体吗? 任何人都可以找到任何文档或提供明确证明答案的代码吗?


修改

他提出以下内容作为开始尝试并证明上述内容 - 但我认为所有证明都是它们都是字符串:

Sub aaa()

Dim str_str As String
Dim str_var

str_str = "aaa"
str_var = "aaa"
str_xxx = "aaa"

MsgBox VarType(str_str) & ": " & TypeName(str_str)
MsgBox VarType(str_var) & ": " & TypeName(str_var)
MsgBox VarType(str_xxx) & ": " & TypeName(str_xxx)

End Sub

3 个答案:

答案 0 :(得分:11)

您可以使用Debug和Locals窗口演示您的同事所说的不正确: enter image description here
Dim as string创建一个字符串类型但Dim as Variant并指定一个字符串为你提供一个带有子类型字符串的变体

答案 1 :(得分:7)

不,并非所有变量都是Variant。变体和字符串具有不同的存储大小;根据{{​​1}}语句中的数据类型分配此内存。一个人不仅仅是神奇地转向另一个人。

在VBA帮助文件中查找“数据类型摘要”。或者,看看这里: http://msdn.microsoft.com/en-us/library/aa263420%28v=vs.60%29.aspx

  

'--->创建了vartype = vbEmpty的变体,然后将vartype更改为vbString

你的同事在哪里得到这个想法?!绝对没有证据证明这一点。文档特别指出,“当变量初始化[...]时,可变长度字符串被初始化为零长度字符串(”“)”, Dim

他混乱的根源可能是那个

vbEmpty
默认情况下,

相同
Dim x

但是他可能猜错(错误地)当你写Dim x as Variant 时,Dim x As String首先被解释,从而创建一个Variant,然后Dim x进来,把它变成一个String。这很简单。 As StringAs String语句的一部分,整个语句立即被解释。

严格解决您的问题,我认为不可能找到任何明确说明“Dim 首先创建Variant然后将其更改为字符串”的文档。但实际上,你的同事有责任为他的extraordinary claims提供证据。他可以整天看,他不会找到任何。

答案 2 :(得分:1)

为了完整起见(作为上述补充):

你的朋友谈论的是或许这个(例子在底部):

http://office.microsoft.com/en-001/access-help/vartype-function-HA001228932.aspx

这是一个VBA功能,只是一个有用的工具,以防你想要使用动态类型转换

如果您只使用动态类型并在“始终”链接中应用示例(VBA中的错误做法),那么您的所有变量都将作为变体开始(非常不推荐)。

也许他将VBA静态类型与Javascript之类的编程语言混淆,后者不使用静态类型; JS进行隐式类型转换:var i = 0~>由JS运行时隐式输入数字。

注意:虽然在VBA中建议使用静态类型,但事实上VBA程序员使用动态类型(如果在运行时之前未知变量的类型)。