5

在 VBA 中,您可以Call在它们之前调用您的方法/函数,以明确告诉编译器您不想使用返回值(如果有的话)。

现在DoEvents 函数也应该可以通过 调用Call,但我无法实现。

当我输入:

Call DoEvents

编译时它只是说“语法错误”。

为什么我不能使用Callinfront of DoEvents


在 Excel 2016、IIRC 中使用 VBE 中的 VBA,它在 2013 年、2010 年等中也不起作用。

4

1 回答 1

3

tldr; 可以 Call,但只能从 VBA 模块中显式执行。

正如@Gary'sStudent 链接的文档(请参阅此处的应用程序不可知版本)指出,DoEvents实际上是 aFunction不是 a Sub,它在 VBA 中总是返回 0 。在未承载的 Visual Basic(即 VB6)中,它返回打开窗口的总数。关于为什么它返回零,我完全没有根据的猜测是,在 VBA 中,代码正在运行的进程的顶级窗口不属于您正在执行的代码。

函数本身在VBA.Interaction模块中,您可以在对象浏览器中看到:

对象浏览器中的 DoEvents

也就是说,您应该注意,您可以使用关键字DoEvents前面的函数Call- 但您需要显式引用VBA程序集:

Sub Example()
    'This is perfectly fine.
    Call VBA.DoEvents
End Sub

同样,这只是猜测,但我怀疑原因与内部实现有关。通常这将调用SwitchToThread函数(vbe7.dll 确实导入了该函数)。但是返回值的性质指向枚举产生的窗口因此它可能只需要一个句柄VBA即可运行。typelib 中没有任何内容表明它与 Interaction 模块中的任何其他函数不同(尽管我可能在某处遗漏了一个标志):

[entry(598), helpcontext(0x000f7900)]
short _stdcall DoEvents();

编译错误“Expected: identifier”的性质表明存在某种内部内容“隐藏”DoEvents了全局可访问的 VBA 函数。


最后一点:Call Foo语法完全是多余的——它所做的只是显式地丢弃函数的返回值。不分配返回值的作用完全相同。

于 2016-12-19T15:35:22.880 回答