为什么我不能使用DoEvents的调用?

时间:2016-12-19 13:32:00

标签: excel vba call doevents

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

现在也可以通过Call调用DoEvents function,但我无法实现。

当我输入:

Call DoEvents

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

为什么我不能使用Call前面的DoEvents

在Excel 2016中使用VBE中的VBA,IIRC在2013年,2010年等也没有使用。

1 个答案:

答案 0 :(得分:3)

tldr; 可以 Call它,但只能从VBA模块中明确说明。

由@ Gary'sStudent(see the application agnostic version here)链接的文档指出,DoEvents实际上是Function而不是Sub,它总是会返回0 VBA。在unhosted Visual Basic(即VB6)中,它返回打开窗口的总数。我对为什么返回零的完全未经证实的猜测是,在VBA中,代码运行的进程的顶级窗口不归您正在执行的代码所有。

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

DoEvents in the Object Browser

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

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

同样,这只是猜测,但我怀疑其原因与内部实施有关。通常,这将调用SwitchToThread函数(vbe7.dll确实导入)。但返回值的性质指向枚举的窗口,因此它可能只需要一个句柄VBA来运行。类型库中没有任何东西表明它与“交互”模块中的任何其他函数不同(尽管可能存在我错过的标记):

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

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

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