为什么我不能在 DoEvents 前面使用 Call?

Why can't I use Call infront of DoEvents?

在 VBA 中,您可以调用 methods/functions 并在它们前面加上 Call,以明确告诉编译器您不想使用 return值(如果有的话)。

现在 DoEvents function 也应该可以通过 Call 调用,但我做不到。

当我输入时:

Call DoEvents

它在编译时只是说"syntax error"。

为什么我不能在 DoEvents 前面使用 Call


在 Excel 2016 年使用 VBE 的 VBA,IIRC 在 2013 年、2010 年等也没有用

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

正如@Gary'sStudent (see the application agnostic version here) 所链接的文档所指出的,DoEvents 实际上是 Function 而不是 Sub,并且它将始终 return VBA 中的 0。在非托管 Visual Basic(即 VB6)中,它 return 是打开的总数 windows。关于 为什么 它 return 为零,我完全没有根据的猜测是,在 VBA 过程的顶层 window 中,代码是 运行ning 不属于您正在执行的代码。

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

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

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

同样,这只是猜测,但我怀疑原因与内部实现有关。通常这会调用 SwitchToThread 函数(vbe7.dll 确实导入)。但是 return 值的性质指向枚举 的 windows,所以它可能只需要 VBA 到 运行。 typelib 中没有任何内容表明它与交互模块中的任何其他函数不同(尽管我可能在某处遗漏了一个标志):

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

编译错误 "Expected: identifier" 的性质表明存在来自全局可访问 VBA 函数的 "hiding" DoEvents 内部内容。


最后说明:Call Foo 语法完全是多余的——它所做的只是显式丢弃函数的 return 值。不 分配 return 值完全相同。