为何VBA的Option Explicit未检测到函数内的“未声明变量”?
关于Option Explicit与ByVal参数的疑问解答
嘿,这个问题其实是对Option Explicit和VBA参数声明的小误解,我来给你理清楚:
核心澄清:函数参数本身就是合法的变量声明
你写的Function ParseJSON(ByVal strJSON As String)里,strJSON已经被明确声明为String类型了——参数列表里的定义本质上就是在函数作用域内声明了这个变量,不管用ByVal还是ByRef,它都是已声明的变量。这就是为什么Option Explicit没报错的原因,和ByVal无关。Option Explicit的检查范围覆盖所有过程
Option Explicit绝对不是只检查Sub过程,它会检查所有VBA过程:包括Sub、Function、Property Get/Let/Set,甚至类模块里的方法。只要在过程内部使用了未声明的变量,不管是什么类型的过程,都会触发编译错误。ByVal的作用和变量声明是两回事
你最后用MsgBox证实实参没被修改,这是ByVal的正常特性:它传递的是参数的副本,函数内部对strJSON的修改只会影响这个副本,不会波及外部的实参。但这个特性和Option Explicit的变量检查完全无关,只是刚好一起出现而已。
举个反例验证:如果在ParseJSON函数内部加一行temp = strJSON,而且没有提前声明temp,这时候Option Explicit就会立刻抛出“变量未定义”的编译错误,这就能直观证明它确实在检查Function过程。
内容的提问来源于stack exchange,提问作者Nicholas Humphrey
相关产品推荐
相关产品推荐

