在VBA中,所有variables都是以variablestypes开始的

引用我的同事:

VBA中的所有variables都是变体,但具有不同的变体types:

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中的所有variables都是变体吗?
任何人都可以find任何文件或提供代码来明确地certificate答案的方式或其他?


编辑

他提出以下几点作为尝试和certificate上述的一个开始 – 但是我认为它certificate了它们都是string:

 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 

你可以使用Debug和本地窗口来演示你的同事说的是不正确的: 在这里输入图像说明
Dim as string创build一个stringtypes,但是Dim作为Variant并且分配一个string给你一个带有子typesstring的变体

不,不是所有variables都是变体。 变体和string有不同的存储大小; 这个内存根据Dim语句中的数据types被分配。 一个不只是神奇地变成另一个。

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

'—>变种vartype = vbEmpty创build,然后vartype更改为vbString

你的同事在哪里得到这个想法? 这绝对没有证据。 该文档特别说:“当初始化variables时,可变长度string被初始化为零长度string(”“)”, 而不是 vbEmpty

他的困惑的根源可能是这样的

 Dim x 

是,默认情况下是一样的

 Dim x as Variant 

但他可能猜到(错误地),当你写Dim x As StringDim x首先被解释,从而创build一个Variant,然后As String进入,把它变成一个String。 这显然是不正确的。 As StringDim语句的一部分,整个语句被立即解释。

严格解决你的问题,我不认为有可能find任何具体说明“ Dim x As String 首先创buildVariant然后将其更改为string”的文档。 但是,真的,你的同事的负担是为他的非同寻常的主张提供证据。 他可以整天看,他不会find任何。

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

你的朋友所说的可能是这个(例如底部):

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

这是一个VBA函数,只是一个有用的工具,如果你想使用dynamictypes转换

如果你只使用dynamictypes,并在“always”链接中应用这个例子(在VBA中不好的做法),那么所有的variables都会以variables(高度不推荐的)开始。

也许他混淆了VBA静态types和Javascript之类的编程语言,它不使用静态types; JS进行隐式types转换:var i = 0〜>隐式键入JS运行时的一个数字。

注意:虽然在VBA中build议使用静态types,但事实上VBA程序员使用dynamictypes(如果在运行前未知variables的types)。