为什么我不能在 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 值完全相同。
在 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 值完全相同。