为什么变量形参在函数调用时改变其类型



我正要寻求帮助,却发现了这种看似奇怪的行为的原因。这对我来说似乎很晦涩,所以我想我应该把它贴出来,以防其他人遇到类似的事情。如果这里的大师能告诉我为什么会发生这种情况,我想知道。

我正在调用一个在注册表中保存UserForm指标的例程。声明是:

Public Sub SaveFormSettings(FormReference As Variant)

我使用Variant类型是因为UserForms是类(不同的类型)。用户表单使用以下调用来保存其指标:

SaveFormSettings Me

我通常从userforms的QueryClose事件中调用它,以便在下次运行时使用RestoreFormSettings恢复位置和大小(表单指标在UserForm Terminate事件中不再可用)。

最近,我添加了一个中间例程,除了调用SaveFormSettings之外,它还做了额外的工作,我在QueryClose事件中调用它。这个例程看起来像:

Public Sub QueryCloseEvent(FormReference As Variant, Optional SaveSettings As Boolean = True)

,它这样做:

If SaveSettings Then SaveFormSettings (FormReference)

编译时没有错误报告。但是现在,SaveFormSettings例程接收的FormReference参数不是UserForm类型,如MyForm1,而是类型为"control"。当该例程试图通过:

获取用于构建注册表键值的表单名称时,将导致错误。
n = FormReference.Name & " Form Metrics"

这个语句在没有QueryClose函数的情况下工作。

现在,当我输入这个问题并分析我的代码中可能出现的错误时,我发现这个问题是由FormReference周围的括号引起的。当我将代码改为:

If SaveSettings Then SaveFormSettings FormReference ' <-- no parens

现在可以正常工作了。为什么?

删除括号

If SaveSettings Then SaveFormSettings FormReference

按照在VBA函数调用中控制括号使用的规则中的解释?:

VBA计算该对象,如果没有属性,则返回默认属性。

Userform对象的默认属性似乎是它的Controls属性