在 VBA 中,您可以Call
在它们之前调用您的方法/函数,以明确告诉编译器您不想使用返回值(如果有的话)。
现在DoEvents 函数也应该可以通过 调用Call
,但我无法实现。
当我输入:
Call DoEvents
编译时它只是说“语法错误”。
为什么我不能使用Call
infront of DoEvents
?
在 Excel 2016、IIRC 中使用 VBE 中的 VBA,它在 2013 年、2010 年等中也不起作用。
在 VBA 中,您可以Call
在它们之前调用您的方法/函数,以明确告诉编译器您不想使用返回值(如果有的话)。
现在DoEvents 函数也应该可以通过 调用Call
,但我无法实现。
当我输入:
Call DoEvents
编译时它只是说“语法错误”。
为什么我不能使用Call
infront of DoEvents
?
在 Excel 2016、IIRC 中使用 VBE 中的 VBA,它在 2013 年、2010 年等中也不起作用。
tldr; 您可以 Call
,但只能从 VBA 模块中显式执行。
正如@Gary'sStudent 链接的文档(请参阅此处的应用程序不可知版本)指出,DoEvents
实际上是 aFunction
不是 a Sub
,它在 VBA 中总是返回 0 。在未承载的 Visual Basic(即 VB6)中,它返回打开窗口的总数。关于为什么它返回零,我完全没有根据的猜测是,在 VBA 中,代码正在运行的进程的顶级窗口不属于您正在执行的代码。
函数本身在VBA.Interaction
模块中,您可以在对象浏览器中看到:
也就是说,您应该注意,您可以使用关键字DoEvents
前面的函数Call
- 但您需要显式引用VBA
程序集:
Sub Example()
'This is perfectly fine.
Call VBA.DoEvents
End Sub
同样,这只是猜测,但我怀疑原因与内部实现有关。通常这将调用SwitchToThread函数(vbe7.dll 确实导入了该函数)。但是返回值的性质指向枚举产生的窗口,因此它可能只需要一个句柄VBA
即可运行。typelib 中没有任何内容表明它与 Interaction 模块中的任何其他函数不同(尽管我可能在某处遗漏了一个标志):
[entry(598), helpcontext(0x000f7900)] short _stdcall DoEvents();
编译错误“Expected: identifier”的性质表明存在某种内部内容“隐藏”DoEvents
了全局可访问的 VBA 函数。
最后一点:Call Foo
语法完全是多余的——它所做的只是显式地丢弃函数的返回值。不分配返回值的作用完全相同。