VBA程序中,利用API函數讓程序達到毫秒級的延時

2020-12-11 VBA語言專家

大家好,我們今日繼續講解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 本節講了兩種延時的方式,是否理解呢?

相關焦點

  • VBA代碼實現毫秒級延時及打開網頁方案
    大家好,今日內容仍是和大家分享VBA編程中常用的簡單「積木」過程代碼,這些內容大多是取至我編寫的「VBA代碼解決方案」教程中內容。NO.199-NO.200內容是:NO. 199:在VBA代碼中使用API函數,實現毫秒級別的延時效果NO. 200:在VBA代碼中實現打開頭條的主頁。
  • 一個簡單的按鍵去抖延時程序
    >IDR & 0x01)== 0 { //進行按鍵處理函數 }}本文引用地址:http://www.eepw.com.cn/article/201611/324051.htm這個程序,需要有一個普通的延時程序,來檢測去抖動,這個延時一般採用for循環和while循環。
  • 微信小程序API相關知識科普
    API是一種接口函數,把函數封裝起來,給開發者,這樣好多的功能就不需要你去實現了,只要會調用就好了。小程序開發框架提供豐富的微信小程序api接口,可以方便的調起微信提供的能力,如獲取用戶信息,本地存儲,支付功能等。
  • 學習STM32必讀懂的程序案例
    所有程序中必須的用法:FLASH_SetLatency(FLASH_Latency_2);位置:RCC 初始化子函數裡面,時鐘起振之後。基礎應用 2,開啟 FLASH 預讀緩衝功能,加速 FLASH 的讀取。
  • 各種彙編延時程序大集合
    在論壇上看到不少不錯的延時程序,整理如下共同分享:本文引用地址:http://www.eepw.com.cn/article/201611/321248.htm精確延時計算公式:延時時間=[(2*第一層循環+3)*第二層循環
  • 在進行C51程序設計時如何精確延時的常見方法介紹
    但應該注意,C51編寫的中斷服務程序編譯後會自動加上PUSH ACC、PUSH PSW、POP PSW和POP ACC語句,執行時佔用了4個機器周期;如程序中還有計數值加1語句,則又會佔用1個機器周期。這些語句所消耗的時間在計算定時初值時要考慮進去,從初值中減去以達到最小誤差的目的。
  • 單片機彙編延時程序的理解
    MOV R7,#250 ;D1: MOV R6,#250 ;D2: DJNZ R6,D2 ;DJNZ R7,D1 ;RET如果用高級語言編程,只需要簡單地調用延時函數就可以實現,但是計算機具體是怎麼實現的呢?
  • 單片機c語言中nop函數的使用方法和延時計算
    ,要求在us級的,採用「_nop_」函數,這個函數相當彙編NOP指令,延時幾微秒。 NOP指令為單周期指令,可由晶振頻率算出延時時間,對於12M晶振,延時1uS。對於延時比較長的,要求在大於10us,採用C51中的循環語句來實現。在選擇C51中循環語句時,要注意以下幾個問題第一、定義的C51中循環變量,儘量採用無符號字符型變量。第二、在FOR循環語句中,儘量採用變量減減來做循環。
  • VBA中API函數聲明系列之七
    為了滿足大家的需求,我會陸續把在一些API函數如何在64位系統中聲明的方法介紹給大家。今日是第六部分。 你要做的是把積木放在合適的位置然後去修正代碼,一定要拷貝,從你的積木庫中去拷貝,然後修正代碼,把時間利用到高效的思考上。 2 建立自己的「積木庫」。平時在學習過程中,把自己認為有用的代碼放在一起,多積累,在用到的時候,可以隨時拿來。你的積木庫資料越多,你做程序的思路就會越廣。
  • 談談51單片機延時子程序
    延時程序在單片機編程中使用非常廣泛,但一些讀者在學習中不知道延時程序怎麼編程,不知道機器周期和指令周期的區別,不知道延時程序指令的用法, ,本文就此問題從延時程序的基本概念、機器周期和指本文引用地址:http://www.eepw.com.cn/article/201611/321877.htm令周期的區別和聯繫
  • 單片機延時程序經驗
    標準的C語言中沒有空語句。但在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。這在彙編語言中很容易實現,寫幾個nop就行了。
  • VirtualApi 期貨CTP TICK級本地量化交易仿真回測系統
    升級說明:Virtualapi V2.5.2 解決了上一個版本在某些環境中查詢持倉回調不反回數據的問題。CTP可以改為自己帳戶接實盤,Virtualapi用戶回測。問題1:SIMNOW和Virtualapi(VirtualApi 期貨CTP TICK級本地量化交易仿真回測首頁)所有什麼不同?
  • 嵌入式C實現延時程序的不同變量的區別
    在嵌入式系統中,延時是經常需要使用的一種手段,延時的方法可以通過使用類似於"NOP"的指令來實現,但是如果延時的時間比較長,如果使用太多的"NOP"指令則會消耗過多的儲存空間,最好的方法是使用子程序(彙編語言中)或子函數(高級語言中)。當然這裡並不打算討論如果使用定時器中斷來實現延時。
  • 編寫延時函數的簡單方法
    本文引用地址:http://www.eepw.com.cn/article/201611/319848.htm過程參考如下:在編譯器下建立一個新項目,也可以利用已有項目。此過程中需要注意,單片機晶振的選擇,因為for循環裡指令的執行時間和晶振有直接關係,本例中晶振使用11.0592M。
  • 搭建第一個程序控制電路LED燈,體會C語言的魅力
    學習C語言,先從讀程序開始!這一點是過來人的經驗之談。本文建議大家選擇一款圖形編程軟體,本文選擇了Mixly。一、首先,介紹一下arduino UNO控制器內部電壓的問題。v 高電平(5V):對應數值是1,輸入狀態3.5V-5.5V。
  • 自學單片機第二十二篇:延時消抖
    既然抖動時間基本不變,那麼,我們就有這樣一種方法,當按鍵出現第一個電位變化,假設是高電位轉變成低電位,那麼我們就延時一段時間,設置10毫秒,10毫秒以後,我們再次判斷此時的電位狀態,是否是低電位,如果是低電位,那麼就認為按鍵按下了,如果是高電位,就認為按鍵是抖動。從低電位變成高電位也是一樣。
  • 利用API函數完成剪貼板Clipboard的操作
    第三節  利用API函數完成剪貼板Clipboard的操作在上一講中,我們對剪貼板中的文本簡單操作進行了了解,是利用MSForms.DataObject對象來完成的,這種對象有前期綁定和後期綁定兩種方式都可以實現目標。今天我們講解利用API函數來完成對剪貼板的操作。這種方式的操作可以設計到各個方面。
  • AVR單片機微秒級和毫秒級延時函數
    在用單片機IO口模擬總線時序時老是碰到問題,自己總結了一下大多數是因為我們的延時不準確造成的,所以自己調了兩個延時函數>,我板子上用的是AT Mega128的單片機和16MHz的晶振,用示波器看了這兩個函數產生的波形還挺準確的,希望大家能用得上 ^_^本文引用地址:http://www.eepw.com.cn/article/201611/321603.htm//16MHz晶振
  • 微贊黑科技,毫秒級超低延遲上線
    微贊黑科技,毫秒級超低延遲為了豐富直播應用場景,給用戶提供極致的觀看體驗,微贊率先推出了基於微信h5的超低延遲直播解決方案,可以實現毫秒級超低延遲直播,為用戶帶來極致地觀看體驗。而在發送和分發,由於網絡抖動等多種不可控因素,導致了直播延時不可控,在APP軟體端能較好控制直播延遲,而基於微信h5場景直播,延遲一直很難控制到3s內。微贊超低延遲直播基於深度優化的直播UDP協議,將延遲控制在1秒以內,同時兼顧秒開、卡頓率等核心指標,從而實現毫秒級的超低延遲。
  • STM32系統滴答_及不可不知的延時技巧上
    =RESET) { EXTI_ClearITPendingBit(EXTI_Line1); LED_0=ON; Delay(); } }此延時函數為阻塞延時如下:voidDelay(void) { u32i; for(i=0;i<0xFFFFF;i++){} }加入延時是為了看出來哪個燈先亮。