在 VBA 中,您可以在调用方法/函数时在其前面加上 Call
,以明确告诉编译器您不想使用返回值(如果有)。
现在是DoEvents function也应该可以通过 Call
来调用,但我无法实现它。
当我输入时:
Call DoEvents
编译时它只是说“语法错误”。
为什么我不能在 DoEvents
前面使用 Call
?
在 Excel 2016、IIRC 中使用 VBE 中的 VBA,它在 2013 年、2010 年等中也不起作用。
最佳答案
tldr;您可以调用
它,但只能从 VBA 模块显式调用。
正如 @Gary'sStudent ( see the application agnostic version here ) 链接的文档所指出的,DoEvents
实际上是一个 Function
而不是 Sub
,在VBA中它总是返回0。在非托管 Visual Basic(即 VB6)中,它返回打开窗口的总数。对于它返回零的原因,我完全未经证实的猜测是,在 VBA 中,代码正在运行的进程的顶层窗口不属于您正在执行的代码。
函数本身位于 VBA.Interaction
模块中,正如您在对象浏览器中看到的那样:
也就是说,您应该注意,您可以使用前面带有 Call
关键字的 DoEvents
函数 - 但您需要显式引用VBA
汇编:
Sub Example()
'This is perfectly fine.
Call VBA.DoEvents
End Sub
同样,这只是猜测,但我怀疑原因与内部实现有关。通常会调用 SwitchToThread函数(vbe7.dll 导入的)。但返回值的本质是枚举生成的窗口,因此它可能只需要一个 VBA 句柄即可运行。类型库中没有任何内容表明它与交互模块中的任何其他函数不同(尽管我可能在某处遗漏了一个标志):
[entry(598), helpcontext(0x000f7900)] short _stdcall DoEvents();
编译错误“预期:标识符”的本质表明,有一些内部内容在全局可访问的 VBA 函数中“隐藏”了 DoEvents
。
最后一点:Call Foo
语法完全是多余的 - 它所做的只是显式丢弃函数的返回值。不分配返回值会起到完全相同的作用。
关于excel - 为什么我不能在 DoEvents 前面使用 Call?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41223747/