2015-08-20 79 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产生相同的结果。