3

引用我同事的话:

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
4

3 回答 3

11

您可以使用 Debug 和 Locals 窗口证明您的同事所说的不正确: 在此处输入图像描述
Dim as string 创建一个字符串类型,但 Dim as Variant 并分配一个字符串会为您提供一个带有字符串子类型的变体

于 2013-10-17T08:03:42.517 回答
7

不,并非所有变量都是 Variant。变体和字符串有不同的存储大小;该内存的分配取决于Dim语句中的数据类型。一个不只是神奇地变成另一个。

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

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

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

他困惑的根源可能是

Dim x

默认情况下,与

Dim x as Variant

但他可能(错误地)猜到了当你写Dim x As String的时候,Dim x首先被解释从而创建一个变体,然后As String进来,把它变成一个字符串。这是完全不正确的。As String是语句的一部分Dim,整个语句立即被解释。

严格解决您的问题,我认为不可能找到任何明确说明“Dim x As String 首先创建变体然后将其更改为字符串”的文档。但实际上,您的同事有责任为他的非凡主张提供证据。他可以整天寻找,他不会找到任何东西。

于 2013-10-17T07:27:39.163 回答
1

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

您的朋友谈论的可能是这样的(底部的示例):

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

它是一个 VBA 函数,如果您想使用动态类型转换,它只不过是一个有用的工具。

如果您只使用动态类型并在“总是”链接中应用示例(VBA 中的坏习惯),那么您的所有变量都将以变体开始(非常不推荐)。

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

注意:虽然在 VBA 中建议使用静态类型,但实际上存在 VBA 程序员使用动态类型的情况(以防在运行前不知道变量的类型)。

于 2013-10-17T15:11:28.417 回答