在VBA中,您可以在方法/函数前面加上Call
,明确告诉编译器如果有返回值,则不想使用它。
现在,应该也可以通过Call
调用DoEvents函数,但我无法实现它。
当我输入:
Call DoEvents
编译时会简单地提示“语法错误”。
为什么我不能在DoEvents
前使用Call
?
使用来自Excel 2016中VBE的VBA,据我所知,它也无法在2013、2010等版本中工作。
在VBA中,您可以在方法/函数前面加上Call
,明确告诉编译器如果有返回值,则不想使用它。
现在,应该也可以通过Call
调用DoEvents函数,但我无法实现它。
当我输入:
Call DoEvents
编译时会简单地提示“语法错误”。
为什么我不能在DoEvents
前使用Call
?
使用来自Excel 2016中VBE的VBA,据我所知,它也无法在2013、2010等版本中工作。
tldr; 你可以从VBA模块明确地调用它。
正如@Gary'sStudent链接的文档(请参阅此处的应用程序无关版本)所指出的,在VBA中,DoEvents
实际上是一个Function
而不是Sub
,并且它总是返回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
句柄来运行。在类型库中没有任何提示表明它与Interaction模块中的任何其他函数不同(虽然可能有我错过的标志):
编译错误“预期:标识符”的本质表明,有些内部因素正在将[entry(598), helpcontext(0x000f7900)] short _stdcall DoEvents();
DoEvents
隐藏在全局可访问的VBA函数之外。请注意保留HTML标签。
Call Foo
语法完全是多余的 - 它只是显式地丢弃函数的返回值。不 分配 返回值也会产生完全相同的效果。
Call MsgBox("Test", vbOKOnly)
肯定可以工作。DoEvents
是我遇到的第一个(函数?),它不允许我进行调用。 - Mafii