我偶然发现了一些我不理解的行为。考虑以下功能:
Function identity(n As Integer) As Integer
identity = n
End Function
显然这不是最实用的功能,但它很好地突出了我的问题。
这正如我所料,只是返回它的输入是一个整数,否则抛出错误。
但是,如果我将输出更改为Object,我仍然期望这可以工作,因为据我所知,整数是对象。唉,相反,我得到了“价值错误”。
如果输入和输出类型都更改为“对象”,也会发生这种情况。
当输入更改为Object但输出仍为整数时,该函数表现出真正好奇的行为。如果通过'= identity(3)'从excel调用它会出错,但如果通过'= identity(A1)'调用,其中A1包含3,则返回正确的值。
有谁可以解释发生了什么?我是VB的新手,但我以前用过很多不同的语言编程,我从来没有见过这样的东西......
答案 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
变量更直接地存储它的值。