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

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

现在DoEvents函数也应该可以通过调用来Call ,但是我不能做到这一点。

当我input:

 Call DoEvents 

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

为什么我不能使用DoEvents


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

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

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

函数本身位于VBA.Interaction模块中,如您在对象浏览器中所见:

对象浏览器中的DoEvents

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

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

再次,这只是猜测,但我怀疑原因与内部实施有关。 通常,这将调用SwitchToThread函数(vbe7.dll不会导入)。 但是返回值的性质指向枚举窗口,所以它可能只需要VBA的句柄来运行。 typelib中没有任何内容表明它与交互模块中的其他函数不同(尽pipe可能有某个标记我错过了某处):

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

编译错误“预期:标识符”的性质表明有一些内部的东西是从全局可访问的VBA函数中“隐藏” DoEvents的。


最后一点: Call Foo语法是完全多余的,它所做的只是明确地放弃函数的返回值。 不分配返回值是完全一样的事情。