vba - 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
?
解决方案
关键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")))
行后,您将获得相同的运行时间
推荐阅读
- postgresql - 如何将此 PostgreSQL 命令翻译成 Ansible?
- java - AWS API Gateway 请求正文作为函数的 Java POJO
- swift-playground - Audiokit 4.7 Playgrounds 未编译。错误:无法查找符号:
- python - 即使拥有所有权限,权限也被拒绝
- c++ - std::is_sorted 的奇怪行为
- sql - 如何给分组的行编号
- ansible - Ansible“已定义”无法按预期工作以设置变量
- hibernate - 如何解决 JBOSS EAP 7.2 中 JTA 事务的 hibernate.transaction.flush_before_completion 问题?
- c++ - 四嵌套 unordered_map 怪物的替代方案?
- r - 同一图上多个直方图上的正态密度曲线