为什么我不能使用DoEvents的呼叫面前?

Maf*_*fii 5 excel vba call doevents

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

现在也可以调用DoEvents函数Call,但我无法实现.

当我输入:

Call DoEvents
Run Code Online (Sandbox Code Playgroud)

它只是在编译时说"语法错误".

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


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

Com*_*ern 3

太棒了;可以做到 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
Run Code Online (Sandbox Code Playgroud)

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

[entry(598), helpcontext(0x000f7900)]
short _stdcall DoEvents();
Run Code Online (Sandbox Code Playgroud)

编译错误“预期:标识符”的本质表明,有一些内部内容DoEvents对全局可访问的 VBA 函数“隐藏”。


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