首页 > 解决方案 > 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

标签: vba

解决方案


关键Option Explicit是让您明确声明您正在使用的所有变量,这就是实际发生的情况Function ParseJSON(ByVal strJSON As String) As String:即strJSON As String声明strJSON将在函数内部使用的变量(并且它也将其声明为String类型)

然后,您还给它一个由调用 sub 传递的值,这ByVal仅仅意味着函数strJSON变量将假定的任何值都不会影响调用 sub 变量(如果有的话,并且可能偶然以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")))行后,您将获得相同的运行时间


推荐阅读