为啥 Application.Wait 会出现编译错误:“Invalid Qualifier”

Posted

技术标签:

【中文标题】为啥 Application.Wait 会出现编译错误:“Invalid Qualifier”【英文标题】:Why does Application.Wait get a compile error: "Invalid Qualifier"为什么 Application.Wait 会出现编译错误:“Invalid Qualifier” 【发布时间】:2015-02-03 05:48:37 【问题描述】:

我正在尝试在 Excel VBA 代码中插入暂停。以下代码生成编译错误:“Invalid Qualifier”。

函数 Pause() 试图将 Application.Wait 方法与 DoEvents 结合起来,以获得两全其美的效果; Excel 将继续处理击键和鼠标点击,而不会在等待时占用 CPU 资源。

背景:

http://www.fmsinc.com/microsoftaccess/modules/examples/avoiddoevents.asp http://www.cpearson.com/excel/WaitFunctions.aspx

http://vbadud.blogspot.com/2008/03/sleep-function-in-excel-vba.html

Public Declare Function GetTickCount Lib "kernel32" () As Long
' A DoEvents loop uses CPU power.
' Application.Wait suspends all keyboard and mouse actions.
' This function is a hybrid to combine the best of both worlds.
Public Sub Pause(Optional Timeout As Single = 5)
    Dim EndTime

    EndTime = GetEndTick(Timeout)
    Do While GetTickCount() <= EndTime
        DoEvents
        Application.Wait DateAdd("s", 0.1, Now)
    Loop
End Sub

' Timeout is in seconds.
Function GetEndTick(Timeout)
    GetEndTick = GetTickCount() + Timeout * 1000
End Function

【问题讨论】:

您的代码完全按照发布的方式对我运行。您在哪里运行它 - 在 Excel 中? 这很奇怪。我打开了另一个 Excel 实例并复制了代码,它工作正常。但它在原版中不起作用。当我单击“运行”、“编译...”时,我收到错误消息。我什至尝试重新启动 Excel,但没有帮助。这很令人费解。 我尝试了 Application 对象的其他方法和属性,例如Application.CalculateFull,编译时出现同样的错误。 您是否声明了一个名为 Application 的变量或模块? 就是这样!有一个 Enum 变量类型,其中“应用程序”作为选项之一。删除它解决了问题。 【参考方案1】:

由于某种原因无法识别 Application 对象来回答我的问题。我成功使用了以下解决方法:

Worksheets.Application.Wait DateAdd("s", 0.1, Now)

但是我发现 Worksheets.Application.Wait 占用了 CPU 资源,这违背了目的。相反,这是一个有效的暂停功能:

#If VBA7 Then
    ' Insert PtrSafe for Excel 64 as per http://***.com/a/5507370/2529619 
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
    Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Function GetTickCount Lib "kernel32" () As Long
#End If

' "Pause" code execution for "Timeout" seconds.
'
' Excel will continue to process the keyboard and mouse clicks at least once a second.
' This Pause function will not take up lots of CPU resources.
' 2015.02.04 -- Chaim Gewirtz
Public Sub Pause(Optional Timeout As Single = 5)
    Dim EndTick

    ' There are 1000 'ticks' in a second.
    EndTick = GetTickCount() + Timeout * 1000
    Do While GetTickCount() <= EndTick
        ' Process keyboard and mouse events while waiting.
        DoEvents

        ' If there is at least one more second to pause then...
        If EndTick - GetTickCount() > 1000 Then
            ' "Wait" for one second without using CPU resources.
            Sleep 1000
        End If
    Loop
End Sub

【讨论】:

【参考方案2】:

Visual Basic - 所有变体 - 使用行尾作为语句结束标记。这与使用分号作为语句终止符的 C# 和使用分号作为语句分隔符的 Delphi 形成鲜明对比。

所以,这一行:

Application.Wait DateAdd("s", 0.1, Now)

被视为单个语句,它没有意义。编译器能做的最好的事情就是认为您想使用Application.Wait 作为限定符,但它不理解它。

把代码改成这样:

Application.Wait 
DateAdd("s", 0.1, Now)

它至少应该执行。不过,这是否是好的做法是另一个问题。

【讨论】:

发布的行是完全正确的,因为 Wait 期望将日期/时间参数传递给它。 Bevan 表示Application.Wait DateAdd("s", 0.1, Now) 等价于Call Application.Wait(DateAdd("s", 0.1, Now))

以上是关于为啥 Application.Wait 会出现编译错误:“Invalid Qualifier”的主要内容,如果未能解决你的问题,请参考以下文章

为啥 c = ++(a+b) 会出现编译错误?

为啥 Java 会出现“无法访问的语句”编译器错误?

为啥在尝试定义函数体时会出现此编译器错误?

为啥在使用 OpenGL 编译顶点着色器时会出现着色器编译器错误 #143、#160 和 #216?

为啥在尝试调用采用动态参数的基本构造函数/方法时会出现此编译错误?

当我的代码超出函数范围时,为啥会出现编译器错误“未命名类型”?