在VBA中,你可以在它们之前用Call
调用你的方法/函数,以明确地告诉编译器你不想使用返回值(如果有的话)。
现在也可以通过Call
调用DoEvents function,但我无法实现。
当我输入:
Call DoEvents
编译时只是说“语法错误”。
为什么我不能使用Call
前面的DoEvents
?
在Excel 2016中使用VBE中的VBA,IIRC在2013年,2010年等也没有使用。
答案 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
关键字前面的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
语法完全是多余的 - 它所做的只是显式地丢弃函数的返回值。不分配返回值完全相同。