我正要寻求帮助,却发现了这种看似奇怪的行为的原因。这对我来说似乎很晦涩,所以我想我应该把它贴出来,以防其他人遇到类似的事情。如果这里的大师能告诉我为什么会发生这种情况,我想知道。
我正在调用一个在注册表中保存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
属性