引用我的同事:
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
答案 0 :(得分:11)
您可以使用Debug和Locals窗口演示您的同事所说的不正确:
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 String
是As 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程序员使用动态类型(如果在运行时之前未知变量的类型)。