VBA Option Explicit无法检测Function中未声明的变量

时间:2018-05-16 03:07:42

标签: vba

我一直在每个模块中使用Option Explicit。直到现在,我从未考虑过这么多。

代码:

Option Explicit

Function ParseJSON(ByVal strJSON As String) As String
    strJSON = "New String"
    'MsgBox (strJSON)
    ParseJSON = strJSON
End Function

Sub Test()
    Dim strJSON As String
    strJSON = "Old String"
    MsgBox (ParseJSON(strJSON))
    MsgBox (strJSON)
End Sub

这段代码只是一个测试,与JSON无关。当我运行代码时,我希望它抛出一个错误,因为strJSON永远不会在ParseJSON中声明,并且它应该是一个新变量,因为原始的变量是ByVal,因此不能被更改后,最后一个MsgBox()确认了这一点。

有什么我没有得到的吗?我的预感指向ByVal部分。或者Option Explicit只检查Sub

2 个答案:

答案 0 :(得分:2)

Option Explicit的目的是让你明确声明你正在使用的所有变量,这就是Function ParseJSON(ByVal strJSON As String) As String中实际发生的事情:strJSON As String声明变量strJSON你将在函数中使用(并且它还将其声明为String类型)

然后,你也给它一个由调用子传递的值,而ByVal只是意味着函数strJSON变量假定它不会影响调用的任何值子变量(如果有的话,可能在strJSON之后偶然命名,但它与函数strJSON不同)你传递了

的值

这就是为什么你尝试

Function ParseJSON(ByVal strJSON As String) As String
    strJSON = Range("A1:A3")
    'MsgBox (strJSON)
    ParseJSON = strJSON
End Function 

处理type mismatch error行后,您将获得运行时间strJSON = Range("A1:A3")

这就是为什么你尝试

Sub Test()
    Dim strJSON As String
    strJSON = "Old String"
    MsgBox (ParseJSON(Range("A1:A3")))
    MsgBox (strJSON)
End Sub

处理type mismatch error行后,您将获得相同的运行时间MsgBox (ParseJSON(Range("A1:A3")))

答案 1 :(得分:0)

您的声明正确。 在Test函数中,使用DIM语句将其声明为字符串。 通过在函数中将其作为参数,您还可以将其声明为字符串,以供在函数中使用。

由于该函数使用byVal,并且对IN函数进行的更改不会影响字符串的值。

要更改它的值,必须由Ref传递。 ByRef有效地传递了实际变量。 -甚至可以用不同的名称来知道它,但是任何更改也会更改原始变量。

byVal有效地传递了变量的副本,您可以使用它,但不能更改原始副本。

想象成一张纸。 byRef您移交要标记的实际纸张 byVal您会交出复印件,但要保留原件。