2014-12-10 309 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的相等運算符是=運算符。