为什么我不能使用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
模块中,如您在对象浏览器中所见:
也就是说,您应该注意,您可以使用以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
语法是完全多余的,它所做的只是明确地放弃函数的返回值。 不分配返回值是完全一样的事情。