繁体   English   中英

为什么Application.Wait会出现编译错误:“无效的限定符”

[英]Why does Application.Wait get a compile error: “Invalid Qualifier”

我正在尝试在Excel VBA代码中插入一个暂停。 下面的代码生成一个编译错误:“无效的限定符”。

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

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

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

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

#If VBA7 Then
    ' Insert PtrSafe for Excel 64 as per http://stackoverflow.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

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

因此,此行:

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

被视为单个语句,这没有任何意义。 编译器可以做的最好的事情就是认为您希望将Application.Wait用作限定符,但它不理解。

将代码更改为此:

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

并且至少应该执行。 不过,这是否是一个好习惯是另一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM