VBA Timer 函數:取得午夜後經過的秒數與效能測速
VBA Timer 函數:取得午夜後經過的秒數與效能測速
📅 發布日期:2026-09-01
🏷️ 分類:日期與時間 VBA 函數
💡 函數速查卡
| 函數名稱 | Timer |
|---|---|
| 所屬類別 | 日期與時間 (Date & Time) |
| 傳回類型 | Single (單精度浮點數) |
| 常用頻率 | ★★★★☆ |
在 Excel VBA 的開發中,Timer 是用來測量時間間隔極為關鍵的內建函數。它傳回自午夜 12:00 AM (00:00:00) 起算至當前時刻所經過的「秒數(含小數點)」,非常適合用來計算程式碼執行耗時、建構微秒級的延遲(Wait)機制或基準測試(Benchmarking)。
一、 基本語法與參數
Timer 函數不需要任何參數,標準語法結構如下:
Timer
| 參數 | 說明 | 預設值 / 必填 |
|---|---|---|
無 |
本函數不接收任何傳入參數。 | 無 |
二、 核心功能說明
Timer 傳回值為從午夜起算的總秒數,範圍介於 0.00 到 86399.99 秒之間(含小數點秒數,精確度通常達百分之一秒級別)。
在實際 VBA 自動化開發中,常見的使用情境包括:
- 計算巨集或迴圈處理巨量資料時所耗費的精確執行時間。
- 撰寫精確至「毫秒/小數秒」等級的暫停延遲函式 (Custom Delay/Sleep)。
- 比較不同演算法或資料結構(如 Array vs Range)的效能差異。
三、 實用程式碼範例
範例 1:測量程式碼執行耗時 (基準測試)
利用程式執行前與執行後的 Timer 相減,即可計算出精確執行時間:
Sub MeasureExecutionTime()
Dim startTime As Single
Dim endTime As Single
Dim elapsedTime As Single
' 記錄起始時間
startTime = Timer
' 模擬耗時計算 (例如一百萬次迴圈)
Dim i As Long, total As Double
For i = 1 To 10000000
total = total + i
Next i
' 記錄結束時間
endTime = Timer
elapsedTime = endTime - startTime
Debug.Print "程式執行完畢,共耗時: " & Format(elapsedTime, "0.000") & " 秒"
End Sub
範例 2:自訂不凍結介面的次秒級延遲函式 (Custom Delay)
傳統 Application.Wait 最小單位僅能達到 1 秒,使用 Timer 搭配 DoEvents 可以實現不足 1 秒(如 0.5 秒)的精確暫停,且不卡死 Excel 畫面:
Sub CustomDelay(seconds As Single)
Dim targetTime As Single
targetTime = Timer + seconds
Do While Timer < targetTime
DoEvents ' 保持 Excel 介面回應
Loop
End Sub
Sub TestDelay()
Debug.Print "開始延遲: " & Now
CustomDelay 2.5 ' 延遲 2.5 秒
Debug.Print "結束延遲: " & Now
End Sub
範例 3:將午夜秒數轉換為標準時間格式
可透過簡易數學運算將 Timer 取得的總秒數還原成時、分、秒格式:
Sub ConvertTimerToTime()
Dim totalSeconds As Long
totalSeconds = CLng(Timer)
Dim hrs As Long, mins As Long, secs As Long
hrs = totalSeconds \ 3600
mins = (totalSeconds Mod 3600) \ 60
secs = totalSeconds Mod 60
Debug.Print Format(hrs, "00") & ":" & Format(mins, "00") & ":" & Format(secs, "00")
End Sub
四、 常見陷阱與注意事項
⚠️ 注意事項 1:跨午夜(00:00:00)計算問題
當程式跨越午夜執行時,
當程式跨越午夜執行時,
Timer 會歸零重算(從 86399.99 變為 0)。若起始時間為深夜 23:59:50,結束時間為 00:00:10,直接相減會得到負數。撰寫計算邏輯時應加上補正判斷:
' 處理跨午夜的相減 logic
elapsedTime = endTime - startTime
If elapsedTime < 0 Then elapsedTime = elapsedTime + 86400
⚠️ 注意事項 2:超高精度需求請改用 API
Timer 函數的精度約在 10 到 15 毫秒(毫秒級)左右。如果需要微秒(Microseconds)等級極高精度的專業效能評測,建議呼叫 Windows API 的 QueryPerformanceCounter 與 QueryPerformanceFrequency。
五、 相關函數推薦
Time:傳回代表當前系統時間的 Variant (Date) 資料。Now:傳回代表當前系統日期與時間的 Variant (Date) 資料。DateDiff:計算兩個日期或時間點之間的指定時間單位差。
六、 官方文件連結
想進一步瞭解更詳細的極端情境與進階用法,可參考微軟官方說明:
留言
張貼留言