Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 使用';传递对UserForm实例的引用时,类型不匹配;我';_Vba - Fatal编程技术网

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
。这也可能很有趣: