大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、時間をミリ秒単位や時間単位で、計測する方法についてご紹介します。使うVBA関数は、TimerもしくはNowです。VBAを高速したいのでミリ秒単位で時間を計測したい、という場合は、Timerを使います。日付が変わったり時間がかかる場合は、時間単位で計測するNowが使えます。

はじめに

この記事では、VBAの実行時間を計測する方法について、ご紹介します。

ミリ秒単位の、短い時間を計測したい場合は、『Timer』を使って、日付が変わってしまうぐらい長くなる場合は、『Now』が使えます。

時間を計測して数値化できれば、VBAコードのどこで、どれぐらい時間がかかっているかが一目でわかります。

時間を数値化して、VBAコードを高速化していきましょう。

この記事で紹介すること

  • 時間をミリ秒単位で計測する方法
  • 時間を時間単位で計測する方法

目次から見たい項目へ移動すると便利ですよ。

目次

ポイントとなるVBAコード

ポイントとなるVBAコードを、記載しておきます。

VBAコードだけ確認したいという場合に、ご活用ください。

Dim T
'ミリ秒単位で計測
T = Timer '0時からの時間を取得
'----VBAコードを記載----
Debug.Print Timer - T & " 秒" '計測した時間を表示

Dim A, B, C, D
'時間単位で計測
A = Now '今日の日付+現在の時間を取得
'----VBAコードを記載----
B = Now '今日の日付+現在の時間を取得
C = Int(B - A) '差分を計算して、整数部分を取得
'差分を計算して、日付型に変換して、時間部分を取得
D = TimeValue(CDate(B - A))

では、解説していきます。

VBAでTimerを使ってミリ秒で計測

VBAで、時間を計測したい場合は、『Timer』が便利です。

ミリ秒単位で、時間を計測することができます。

VBAコードを高速化したい、といった場合に、VBAの実行時間を測定する際に使えます。

VBAコードの中で、部分的に時間を計測していくと、どこで時間がかかっているのかが確認できます。

どこで時間がかかっているのかがわかれば、VBAコードを高速化することができるかもしれませんよね。

そんなときに、『Timer』が使えます。

では、使い方を具体的なVBAコードを使いながら、解説していきます。

使い方(Timer)

『Timer』関数は、次のようにして時間を取得できます。

『時間 = Timer』

Timer関数で取得できるのは、『0時からの時間』です。

Timer関数を使えば、ミリ秒単位で、時間を取得できます。

では、Timerを使ってVBAの実行時間を測定してみましょう。

VBA実行時間をミリ秒で計測

VBAの実行時間を測定するには、VBAコードの最初と最後の方に、Timer関数を配置して、最初と最後の差分をとることで、VBAの実行時間を測定します。

言葉で説明するより、VBAコードを見たほうが早いと思います。

こんな感じでVBAコードに入力します。

Sub TEST1()
    
    Dim T
    T = Timer '0時からの時間を取得
    
    '時間がかかる処理をする
    Dim A
    A = 0
    For i = 1 To 10000000
        A = A + 1
    Next
    
    '計測した時間を表示
    MsgBox Timer - T & " 秒"
        
End Sub
  • ①VBAコードの最初に、Timerで時間を取得
  • ②最後にTimerで時間を取得して、差分を計算

というような流れです。

実行してみます。

計測した結果

VBAの実行時間を計測した結果

結果は、『0.59375 秒』となりました。

ミリ秒単位で、時間を計測できています。

Debug.Printを使うと便利

時間を計測する際は、『イミディエイト』画面に、『Debug.Print』で表示すると便利です。

イミディエイト画面を使えば、VBAの実行を止めることなく、実行時間などを表示させることができます。

『イミディエイト』画面とは、こちらのことです。

イミディエイト画面

VBEのイミディエイト画面

こちらに、計測した時間を表示することができます。

『イミディエイト』画面に『Debug.Print』で表示してみます。

『あいうえお』を表示を表示するVBAコードです。

Sub TEST2()
    
    'イミディエイト画面に表示
    Debug.Print "あいうえお"
    
End Sub

実行してみます。

イミディエイト画面に表示

イミディエイト画面にあいうえおが表示される

イミディエイト画面に『あいうえお』が表示されました。

この、イミディエイト画面に、Debug.Printで、VBAの実行時間を表示するVBAコードはこんな感じになります。

Sub TEST3()
    
    Dim T
    '0時からの時間を取得
    T = Timer
    
    '時間がかかる処理をする
    Dim A
    A = 0
    For i = 1 To 10000000
        A = A + 1
    Next
    
    '計測した時間を表示
    Debug.Print Timer - T & " 秒"
    
End Sub

実行しています。

イミディエイト画面に計測した時間を表示

イミディエイト画面にVBAの実行時間が表示される

イミディエイト画面に『0.1875 秒』と表示されました。

VBAの実行時間が計測できています。

VBAの実行時間を表示する場合は、Debug.Printで、イミディエイト画面に表示すると、簡単に実行時間を計測できます。

配列を使って速くなるか確認

ためしに、配列を使うと、VBAの実行時間が短くなるのかを確認してみます。

次の2つのVBAコードを時間を計測してみます。

  • セルに1~1000000の数値をFor文を使って入力
  • 配列に1~1000000の数値を格納して、セルに一括で入力

もちろん、配列を使った方が、速くなります。やってみます。

セルに1~1000000の数値をFor文を使って入力

セルに1~1000000の数値をFor文を使って入力するVBAコードです。

Sub TEST4()
    
    Dim T
    '0時からの時間を取得
    T = Timer
    
    'セルに1~1000000の数値を入力
    For i = 1 To 1000000
        Cells(i, 1) = i
    Next
    
    '計測した時間を表示
    Debug.Print Timer - T & " 秒"
    
End Sub

実行してみます。

セルに1~1000000の数値をFor文を使って入力した結果

実測した時間です。

セルに1~1000000の数値をFor文を使って入力する時間を計測

結果は、『35.99219 秒』となりました。

配列に1~1000000の数値を格納して、セルに一括で入力

次は、配列を使って1~1000000の数値をセルに一括で入力するVBAコードです。

Sub TEST5()
    
    Dim T
    '0時からの時間を取得
    T = Timer
    
    '配列に1~1000000の数値を格納
    Dim A
    ReDim A(1 To 1000000, 1 To 1)
    For i = 1 To UBound(A)
        A(i, 1) = i
    Next
    
    'セルに一括で入力
    Range("A1").Resize(UBound(A)) = A
    
    '計測した時間を表示
    Debug.Print Timer - T & " 秒"
    
End Sub

実行してみます。

配列を使って1~1000000の数値を入力した結果

実測した時間です。

配列を使って1~1000000の数値をセルに一括で入力する時間を計測

結果は、『1.28125 秒』となりました。

やはり、配列を使った方が速いという結果です。

ただ、速くなっただけでなく、時間を計測すると、〇〇秒速くなったと、数値化することができます。

数値化できれば、どれぐらい速いのか、あるいは、遅いのかがわかります。

VBAを高速化したい場合は、どれぐらい、どこに時間がかかっているのかを、まずは、時間を計測して、数値化するといいです。

VBAでNowを使って時間単位で計測

時間を計測する方法は、もう一つあって、Nowを使って時間単位で時間を計測する方法です。

時間単位で計測するとは、『1:10:20』かかりました。という感じです。

比較的、長い時間がかかる場合に使えます。

日付が変わってしまっても計測することができます。

使い方(Now)

初めに、『Now』の使い方を説明しておきます。簡単です。

次のように入力します。

『日付 = Now』

日付には、今日の日付+現在の時間が、入力されます。

VBA実行時間を時間単位で計測

では、Nowを使ってVBAの実行時間を時間単位で計測してみます。

セルに1~1000000の数値をFor文を使って入力する時間を、時間単位で計測するVBAコードです。

Sub TEST6()
    
    Dim A, B, C, D
    
    '今日の日付+現在の時間を取得
    A = Now
    
    'セルに1~1000000の数値を入力
    For i = 1 To 1000000
        Cells(i, 1) = i
    Next
    
    '今日の日付+現在の時間を取得
    B = Now
    C = Int(B - A) '差分を計算して、整数部分を取得
    '差分を計算して、日付型に変換して、時間部分を取得
    D = TimeValue(CDate(B - A))
    
    '計測した時間を表示
    Debug.Print C & "日と" & D
    
End Sub

手順としては、

  • ①「Now」で現在の日付と時間を取得
  • ②VBAコード終了後に、再度「Now」で現在の日付と時間を取得
  • ③時間の差分から整数部分を取得
  • ④時間の差分を日付型に変更して時間部分を取得

という流れです。

では、実行してみます。

実行結果

セルに1~1000000の数値をFor文を使って入力した結果

時間単位で計測した結果です。

時間単位で計測

Nowを使って実行時間を時間単位で計測した結果

結果は、『0日と0:04:20』となりました。

日付+時間単位で実行時間を計測できています。

日付をまたいじゃったり、実行時間が結構かかるけど、どれぐらいかかったか計測したい、といった場合に使えます。

おわりに

この記事では、VBAの実行時間を計測する方法について、ご紹介しました。

比較的、短い時間を計測する際には、『Timer』を使った方法が使えます。

ミリ秒単位で計測できますので、VBAを高速したいときに、遅くなっている原因を探すのに便利な関数です。

比較的に、長い時間を計測する際には、『Now』を使った方法でできます。

時間単位で計測したい、実行していると日付が変わってしまう、という場合に便利です。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す