据我所知,有两种不同的方法可以在VBA中对数据类型进行分类。
我认为对象类型与引用类型相同。但我读到对象和非对象类型之间的分配存在差异:
Dim i As Integer
i = 1
Dim chrt As Chart
Set chrt = something
注意“设置”。现在,在以下链接中,String被归类为引用类型。
http://msdn.microsoft.com/en-us/library/t63sy5hs.aspx
但是
Dim str As String
Set str = "abc"
错了,
Dim str As String
str = "abc"
是对的。因此,引用类型和对象类型不相等。有什么区别?
答案 0 :(得分: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
是值,如Integer
或Boolean
。
答案 1 :(得分:3)
VBA确实有值类型和参考类型,但Strings
和Arrays
都没有整齐地类别。
查看值类型和引用类型的定义是有用的:
值类型
- 如果数据类型将数据保存在自己的内存分配中,则数据类型为值类型。
参考类型
- 引用类型包含指向保存数据的另一个内存位置的指针。
所有Objects
都使用指针,因此它们都是Reference Types
,而以下内容将其值存储在内存位置,因此它们都是Value Types
:
但Strings
和Arrays
不同。他们做使用指针,因此从技术上讲,它们是Reference Types
,但 VBA语言在语义上将Strings
和Arrays
视为{{1 }}
因此,在使用Value Types
和Strings
时,VBA会有以下行为:
在分配给Arrays
或Set
时,没有必要使用String
关键字(除非您分配给{{1}的成员对象)。
将一个Array
或Array
的值分配给另一个会创建该值的副本。
用于比较String
的等号运算符是Array
运算符。