VBA对象类型

时间:2015-08-20 02:36:26

标签: vba

我偶然发现了一些我不理解的行为。考虑以下功能:

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

显然这不是最实用的功能,但它很好地突出了我的问题。

这正如我所料,只是返回它的输入是一个整数,否则抛出错误。

但是,如果我将输出更改为Object,我仍然期望这可以工作,因为据我所知,整数是对象。唉,相反,我得到了“价值错误”。

如果输入和输出类型都更改为“对象”,也会发生这种情况。

当输入更改为Object但输出仍为整数时,该函数表现出真正好奇的行为。如果通过'= identity(3)'从excel调用它会出错,但如果通过'= identity(A1)'调用,其中A1包含3,则返回正确的值。

有谁可以解释发生了什么?我是VB的新手,但我以前用过很多不同的语言编程,我从来没有见过这样的东西......

3 个答案:

答案 0 :(得分: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会产生相同的结果。

答案 1 :(得分:3)

如果n是一个对象而identity返回一个对象,那么在VBA中:

Set identity = n

对象类型需要使用Set而非对象类型如Integer不使用Set

编辑为了回应下面的评论,3是一个整数文字。整数不是对象类型,不能被视为一个。

您可能会发现Variant type很有用,因为它可以同时包含对象和非对象类型。然后,您可以使用TypeName确切地确定您正在处理的内容并相应地进行操作

答案 2 :(得分:2)

整数不是VBA中的对象。 Set隐式设置指向对象(用户定义或内置)的指针。 Integer变量更直接地存储它的值。