我知道我在这里做错了什么。我正在尝试使用sleep函数来延迟我的代码,但是我得到“Sub或Function not defined”错误。有什么提示吗?
答案 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状态栏:
活动单元的地址
倒计时
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"))