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.0086399.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 的 QueryPerformanceCounterQueryPerformanceFrequency

五、 相關函數推薦

  • Time:傳回代表當前系統時間的 Variant (Date) 資料。
  • Now:傳回代表當前系統日期與時間的 Variant (Date) 資料。
  • DateDiff:計算兩個日期或時間點之間的指定時間單位差。

六、 官方文件連結

想進一步瞭解更詳細的極端情境與進階用法,可參考微軟官方說明:

留言

相關文章 / 薪資情報

文章載入中...

你可能有興趣

精選文章 / 推薦情報

文章載入中...