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

标签 excel vba call doevents

在 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 模块中,正如您在对象浏览器中看到的那样:

DoEvents in the Object Browser

也就是说,您应该注意,您可以使用前面带有 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/

相关文章:

excel - 如何将选定的范围(作为 rng 传递)粘贴到工作表的末尾?

vba - Excel VLookup "Object Required"错误

java - 从常规java中的main方法调用javaFX方法

Javascript动态方法调用

excel - 检查当前单元格的值是否与前一个单元格的值匹配

Excel - 如果两列中都存在值,则返回 "true"

excel - ReDim 保留 3D VBA

vba - 如何填充列循环? VBA Excel

excel - 复制可见单元格以将 listobject 过滤后的数据提取到新工作簿

android - 从服务调用 Activity onCallStateChange