2014-12-10 304 views
4

据我所知,有两种不同的方式来对VBA中的数据类型进行分类。哪种数据类型类别是字符串

  • 对象类型与非对象
  • 值类型与参考类型

我假设对象类型是相同的引用类型。但我读到,有关对象和非对象类型之间的分配存在差异:

Dim i As Integer 
i = 1 

Dim chrt As Chart 
Set chrt = something 

注意“Set”。现在在下面的链接中,String被分类为引用类型。

http://msdn.microsoft.com/en-us/library/t63sy5hs.aspx

Dim str As String 
Set str = "abc" 

是错误的,

Dim str As String 
str = "abc" 

是正确的。因此引用类型和对象类型是不等价的。有什么不同?

+3

您提供的链接是关于.Net和VB.Net,* not * VBA(它是基于COM的,而不是基于.Net的)。在VBA中,您可以将字符串视为值类型。然而,在较新的VB.Net中,一方面,整个'Set..'业务消失,另一方面,字符串变成真正的类/对象,但是* VB.Net为了兼容性原因隐藏了这个实例,你不必在字符串中使用'New'关键字)。 – RBarryYoung 2014-12-10 22:10:15

回答

4

您的MSDN链接指的是Visual Studio 2013(.NET),其中String确实是一个对象(如.net框架中的所有内容)。

VBA字符串是值,而不是对象。

据我所知,有两种不同的方法来对VBA中的数据类型 进行分类。

  • 对象类型与非对象
  • 值类型与引用类型

这比简单。一个对象类型一个引用类型非对象类型一个值类型

在VBA中,使用关键字Set指定对象引用;在过去,曾经使用Let关键字分配的值(我相信仍然有效,出于兼容性原因);这就是为什么产权设置者使用Let作为值类型的原因,如Public Property Let Foo(value As Integer)Set的参考类型,如Public Property Set Foo(value As Object)

该语言演变而且Let关键字最终被删除的值的分配;对于对象引用分配,仍需要Set

但在VBA一个String,像IntegerBoolean

3

VBA确实有值类型引用类型,但既不Strings也不Arrays秋天整齐到任何一类。

它的信息看值类型和引用类型的定义:

值类型

  • 数据类型是值类型,如果它拥有自己的存储器内的数据分配。

参考类型

  • 引用类型包含一个指向保存数据的另一个存储器位置。

所有Objects使用指针,所以他们都Reference Types,而下面的商店他们在他们的记忆位置值,所以他们都Value Types

  • 布尔
  • 字节
  • 整数
  • Sin GLE
  • 日期
  • 货币

StringsArrays是不同的。他们使用指针,所以在技术上他们Reference Types VBA语言语义对待StringsArraysValue Types

因此,与StringsArrays工作,VBA时有以下行为:

  • 这是没有必要使用Set关键字分配给当StringArray(除非你分配给对象的Array的成员)。

  • 分配一个StringArray到另一个的值产生的值的复制

  • 用于比较Strings的相等运算符是=运算符。