VBA睡眠不起作用

时间:2010-04-29 13:32:31

标签: vba sleep

我知道我在这里做错了什么。我正在尝试使用sleep函数来延迟我的代码,但是我得到“Sub或Function not defined”错误。有什么提示吗?

7 个答案:

答案 0 :(得分:19)

VBA没有Sleep功能。

你可以像这样从Kernel32.dll导入它:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

请注意,这会冻结应用程序 您也可以在DoEvents循环中调用While,这不会冻结应用程序。

答案 1 :(得分:9)

我尝试过的所有东西似乎都挂起了应用程序,包括Application.Wait。这似乎有效:

waitTill = Now() + TimeValue("00:15:00")

While Now() < waitTill
    DoEvents
Wend

答案 2 :(得分:8)

您也可以使用Application.Wait T暂停当前的宏上下文,这不会阻止整个过程。

答案 3 :(得分:3)

Application.Wait DateAdd("m", 10, Now) ' Wait for 10 Minutes
 Application.Wait DateAdd("s", 10, Now) ' wait for 10 seconds

答案 4 :(得分:1)

这是与32位和64位Windows机器实现交叉兼容性所需要的。延迟以毫秒为单位,因此请使用1000表示1秒钟的延迟。

首先,将其置于模块中其他Subs / Function之上。在64位计算机上,“#Else”之后的行将被高亮显示,好像有错误,但这不是问题。该代码将编译并运行。

#If VBA7 Then
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

现在,您可以像本例一样创建一个具有1.5秒延迟的延迟:

Sub ExampleWithDelay()
    Msgbox "This is a message before the delay."
    Sleep 1500    ' delay of 1,000 milliseconds or 1.5 seconds
    Msgbox "This is a message -AFTER- the delay."
End Sub

如@SLaks所述,这将冻结应用程序(防止用户输入),但您也可以在DoEvents循环中调用While。请参见下面的示例。它运行10秒钟,并允许用户进行交互。

每1/10秒使用以下内容更新Excel状态栏:

  1. 活动单元的地址

  2. 倒计时

    Sub ExampleWithDelayInLoop()    ' for MS Excel
    
        Dim thisMessage As String
        Dim countdownText As String
        Dim i As Long
    
        Const TOTAL_SECONDS As Byte = 10
    
        For i = 1 To TOTAL_SECONDS * 10
    
            countdownText = Excel.WorksheetFunction.RoundUp(TOTAL_SECONDS - (i / 10), 0)
            thisMessage = "You selected " & Excel.ActiveCell.Address & Space$(4) & countdownText & " seconds remaining"
    
            ' Show the address of the active cell and a countdown in the Excel status\
            '   bar.
            If Not Excel.Application.StatusBar = thisMessage Then
                Excel.Application.StatusBar = thisMessage
            End If
    
            ' Delay 1/10th of a second.
            '   Input is allowed in 1/10th second intervals.
            Sleep 100
            DoEvents
    
        Next i
    
    
        ' Reset the status bar.
        Excel.Application.StatusBar = False
    End Sub
    

答案 5 :(得分:0)

使用此代码Excel不会冻结且CPU使用率很低:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Delay(s As Single)
    Dim TimeOut As Single
    TimeOut = Timer + s
    Do While Timer < TimeOut
        DoEvents
        Sleep 1 'With this line the CPU usage is 00 instead of 50 with an absolute error of +1ms and the latency of 1ms.
    Loop
End Sub

答案 6 :(得分:0)

  

暂停应用10秒钟。

Application.Wait (Now + TimeValue("0:00:10"))