2015-08-20 82 views
2

我偶然發現了一些我不明白的行爲。考慮以下功能:VBA對象類型

Function identity(n As Integer) As Integer 
    identity = n 
End Function 

顯然這不是最實用的功能,但它突出了我的問題。

這工作正如我所期望的,只是返回它的輸入是一個整數,否則會引發錯誤。但是,如果我將輸出更改爲一個對象,我仍然期望這能起作用,因爲據我瞭解,整數是對象。唉,相反,我得到了'價值錯誤'。

如果輸入和輸出類型都更改爲對象,則也會發生這種情況。

當輸入更改爲Object但輸出仍爲整數時,函數表現出真正好奇的行爲。如果它是通過'= identity(3)'從excel中調用它的錯誤,但是如果它通過'= identity(A1)'調用,其中A1包含3,它會返回正確的值。

任何人都可以解釋發生了什麼?我是新來的VB,但我已經在許多不同的語言之前編程,我從來沒有見過這樣的事......

回答

3

如果n是對象identity返回一個對象,然後在VBA:

Set identity = n 

對象類型需要使用Set和非對象類型,如Integer不使用Set

編輯在響應下面發表評論,3是文字整數。整數不是對象類型,不能被視爲一個。

您可能會發現Variant type是有用的,因爲它可以同時包含對象類型和非對象類型。然後您可以使用TypeName來計算出您正在處理的內容並相應地執行

+0

這仍然失敗'=身份(3)'。有一些我可以使用的根類嗎?我原以爲是Object ... – DomJack

+0

我在VBA中添加了一些關於對象與非對象的更多細節 – barrowc

2

整數不是VBA中的對象。 Set隱式設置指向對象(用戶定義或內置)的指針。變量Integer更直接地存儲它的值。

4

如果這是爲了一些更大的目的,也許你可以使用變體類型。

Function identity(v As Variant) As Variant 
    identity = v 
End Function 

?identity("K") & "E" 
KE 

?identity("2") + 2 
4 
?identity(2) + 2 
4 
?identity(2) & 2 
22 

?identity("K") & 2 
K2 

?identity("K") + 2 
Run-time error '13': Type mismatch 

VBA被認爲是一個loose-typed(又名 '弱類型')的編程語言,以便增加 「2」 + 2和2 + 2產生相同的結果。