大家好,我們今日繼續講解VBA代碼解決方案的第82講內容:如何利用代碼讓程序延時,SLEEP函數和timeGetTime函數兩個API函數的講解。
在上一講中我們講了使用Wait方法,但這種方法的不足是只能提供精度為1秒的延時,如果需要更低精度的延時,需要使用Sleep API函數,如下面的代碼所示。
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub MyTypeDemo()
Dim sTest As String
Dim i As Integer
sTest = "歡迎你來到這個平臺學習VBA!"
For i = 1 To Len(sTest)
Range("A1").Value = Left(sTest, i)
Sleep 200
Next
End Sub
代碼解析:
MyTypeDemo過程模擬打字效果在單元格A1中輸入一行文字。"歡迎你來到這個平臺學習VBA!"
第1行代碼Sleep API函數聲明,參數dwMilliseconds為以毫秒為單位的時間長度。
在第6行到第9行代碼在每次循環時增加顯示的數據,並且在每次增加時使用Sleep語句延時200毫秒,好像字符逐個輸入,從而達到模擬打字的效果.
在上面的實例中,對於精確延時使用的sleep函數,使用這個函數要注意的是,由於這個函數是Windows API函數,使用前必須先聲明,然後使用。 雖然sleep函數延時是毫秒級的,精確度比較高,但它在延時時會將程序掛起,使作業系統暫時無法響應用戶操作,所以在長延時的時候不適合使用它。
更好的辦法是使用timeGetTime函數,timeGetTime函數返回的是開機到現在的毫秒數,可以支持1毫秒的間隔時間,而且永遠增加,不存在回頭的問題。當然不是永遠不回頭,畢竟Long型變量(雙字,4位元組)也是有取值範圍的,這個值在0到2^32之間。大約49.71天。
同sleep函數一樣,timeGetTime函數是Windows API函數,使用前必須先聲明,即:
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
延時函數和上面的一樣,只是將sleep函數換成timeGetTime:
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub S_timeGetTime()
Dim time1 As Long
time1 = timeGetTime
Range("A2").Value = timeGetTime
Do
Range("A3").Value = timeGetTime
DoEvents
Loop While timeGetTime - time1 < 1000
MsgBox "時間到!"
End Sub
注意:延時時間單位是毫秒。由於延時函數中使用了 DoEvents語句交出了系統控制權,所以不會影響用戶的其它操作。
代碼截圖:
運行:
今日內容回向:
1 如何實現程序的延時呢?
2 本節講了兩種延時的方式,是否理解呢?