对于一堂课,我偶然发现了一张excel表的VBA代码。它显示了函数的实现,其中参数尚未声明为任何类型。调用它时,String
用作此参数。
Option Explicit
' The weird function
Function isXorEmpty(testvalue) As Boolean
If testvalue = "x" Or testvalue = "" Then
isXorEmpty = True
Else
isXorEmpty = False
End If
End Function
' Button click handler
Sub verify_input_conformity_Click()
Dim testvalue As String
testvalue = Sheets(0).Cells(0, SOME_COLUMN_CONSTANT)
If Not isXorEmpty(testvalue) Then
Call SomeFunction()
End If
End Sub
代码在Excel中正常工作,即它检测到错误的输入值。
我已经在互联网上搜索了但是没有得出VBA的这种语言特性被调用的结论,以及当一个参数类型被忽略时它的行为方式。有人能指出我的文件吗?
答案 0 :(得分:2)
Function isXorEmpty(testvalue) As Boolean
这隐含地等同于:
Public Function isXorEmpty(ByRef testvalue As Variant) As Boolean
对于两个字符串比较,Variant
被隐式转换为Variant/String
(两次);如果String
以外的任何内容(实际上,无法隐式转换的任何)通过testValue
传递,则可能发生运行时错误。
此外,隐式ByRef
意味着isXorEmpty
可能会在其正文中重新分配该参数,从而在调用代码中引入微妙的错误。
更好的签名是:
Public Function isXorEmpty(ByVal testvalue As String) As Boolean
那说条件体在两个条件分支中分配一个布尔文字 - 它可以改写如下:
isXorEmpty = (testvalue = "x" Or testvalue = "")