← コード一覧へ戻る
実務Excel・Windows連携

処理時間をミリ秒単位で計測する

高分解能カウンターの差を周波数で割り、計算ループの経過時間をミリ秒で表示します。

実行前に確認

  • Currencyは8バイトの受け皿として使い、カウンターと周波数の同じ倍率が割り算で相殺されます。金額を測る用途ではありません。
  • 小数3桁の表示は測定精度の保証ではありません。OSの負荷などで結果は変わります。Mac版および古いVBA6では動きません。
  • 公式仕様とコードを照合した例です。Excel実機での実行は未検証です。業務ブックではなくコピーで試してください。

1サンプルコード

Option Explicit
Private Declare PtrSafe Function QueryPerformanceCounter Lib "kernel32" (ByRef value As Currency) As Long
Private Declare PtrSafe Function QueryPerformanceFrequency Lib "kernel32" (ByRef value As Currency) As Long
Sub PracticeAdvanced8013()
    Dim startCount As Currency, endCount As Currency, frequency As Currency
    Dim i As Long, total As Double, elapsedMs As Double
    If QueryPerformanceFrequency(frequency) = 0 Then Exit Sub
    If frequency = 0 Then Exit Sub
    If QueryPerformanceCounter(startCount) = 0 Then Exit Sub
    For i = 1 To 1000000
        total = total + Sqr(CDbl(i))
    Next i
    If QueryPerformanceCounter(endCount) = 0 Then Exit Sub
    elapsedMs = CDbl(endCount - startCount) / CDbl(frequency) * 1000#
    MsgBox "経過時間: " & Format$(elapsedMs, "0.000") & " ms" & vbCrLf & "計算結果: " & total
End Sub

図で見る操作の流れ

イメージ図

準備、実行する操作、確認する結果の順で示しています。

  1. 準備

    Windows版ExcelのVBA7(Office 2010以降)の32/64ビット用です。DeclareをSubの外側に含めて貼り付けます。

  2. 操作

    高分解能カウンターの差を周波数で割り、計算ループの経過時間をミリ秒で表示します。

  3. 結果

    100万回の計算ループにかかった時間がmsで表示されます。シートのセルは変更しません。

Currencyは8バイトの受け皿として使い、カウンターと周波数の同じ倍率が割り算で相殺されます。金額を測る用途ではありません。

コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。

使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
  1. 1

    Windows版デスクトップExcelの練習用ブックを.xlsmで保存し、Alt+F11→[挿入]→[標準モジュール]へ、この例だけを貼り付けます。

  2. 2

    Windows版ExcelのVBA7(Office 2010以降)の32/64ビット用です。DeclareをSubの外側に含めて貼り付けます。

  3. 3

    PracticeAdvanced8013を実行します。繰り返す場合は他の重いアプリを止め、同じ条件で比べます。

  4. 4

    100万回の計算ループにかかった時間がmsで表示されます。シートのセルは変更しません。

使っている機能の公式ドキュメント(Microsoft Learn)