我一直在每个模块中使用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
?
答案 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您会交出复印件,但要保留原件。