Vba 使用';传递对UserForm实例的引用时,类型不匹配;我';
考虑名为Vba 使用';传递对UserForm实例的引用时,类型不匹配;我';,vba,Vba,考虑名为Module1的VBA模块中的以下代码: Sub StartTest() Dim frm As UserForm1 Set frm = New UserForm1 frm.Show End Sub Sub Notify(fromForm As UserForm1) MsgBox "Notified." End Sub 以及UserForm1中的以下代码: Private Sub CommandButton1_Click() Module1.No
Module1
的VBA模块中的以下代码:
Sub StartTest()
Dim frm As UserForm1
Set frm = New UserForm1
frm.Show
End Sub
Sub Notify(fromForm As UserForm1)
MsgBox "Notified."
End Sub
以及UserForm1
中的以下代码:
Private Sub CommandButton1_Click()
Module1.Notify (Me)
End Sub
当我运行StartTest
时,表单会出现,当我单击按钮时,我在CommandButton1\u click()
sub中的Module1.Notify(Me)
上得到一个“类型不匹配”错误。为什么
如果我将
Module1.Notify(Me)
更改为调用Module1.Notify(Me)
(感谢@sous2817指出这一点)或Module1.Notify(Me)
,那么我不会得到错误。那么,为什么在我使用Module1.Notify(Me)
时会发生这种情况?将按钮代码更改为:
Private Sub CommandButton1_Click()
Call Module1.Notify(Me)
End Sub
似乎给了我预期的结果
至于“为什么”,请参考:
具体而言:
调用过程时不需要使用Call关键字。
但是,如果使用Call关键字调用需要
参数、argumentlist必须用括号括起来。如果你使用
调用语法来调用任何内在函数或用户定义函数
函数的返回值被丢弃
我不认为你能得到比这更权威的解释:
非常感谢!您的代码修改工作正常。然而,我认为你引用的文章和摘录并不能很好地解释这种情况。当您不使用
调用
但在参数中有参数时,它不会说明任何不同的行为。例如,我发现,通过将代码更改为Module1.Notify Me
,也就是说,不将参数包含在参数中,也可以避免出现错误。冒着给人留下迂腐印象的风险,我想请你在我接受之前在你的回答中说明这个特点。换句话说,如果你能找到另一篇解释上述特点的文章,用它来代替你引用/摘录的内容。我希望我有一个更好的答案,但这似乎是VB6原作者的设计选择。如果使用Call,则必须将参数括在()中,如果省略该调用,则可以省略()…我可以使用具有相同解释(和)的其他stackoverflow链接向您提供大量信息。这有帮助吗?只是,虽然我很感激你帮我克服了错误,但我的问题是为什么会发生这种情况。MSDN的文章没有说“如果你不使用Call,但是你在parens中有参数,你可能会得到一个类型不匹配的错误,这就是为什么……”你明白了吗?@Douglancy--哇,这太神奇了。我已经使用VBA 12年了,我从来都不知道这些。在幸福地忽略了VBA这么长时间之后,我发现对这些深奥的细节进行阐述是非常有趣的。删除括号:Module1.Notify Me
。这也可能很有趣: