大体でIT

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

大体でIT

Excel VBAで時間を比較して、差分を計算する方法について、ご紹介します。時間を比較したり計算するには、CDateで日付型の時間にするとできます。2つの時間の差分を時、分、秒の単位で取得したい場合は、DateDiffがかなり便利です。

はじめに

この記事では、時間を比較して、計算する方法についてご紹介します。

時間を比較したり、計算をする場合には、『CDate』で日付型の時間に変換するとできます。

2つの時間の差分を、時、分、秒の単位で取得したい場合は、『DateDiff』がかなり便利です。

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

この記事で紹介すること

  • 時間を比較する方法
  • 時間の差分を計算する方法

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

目次

ポイントとなるVBAコード

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

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

'比較
a = CDate("17:0:0") '日付に変換
b = CDate("17:00:01") '日付に変換
If a < b Then '⇒bが大きい

'差分を計算
a = "17:0:0"
b = "18:0:0"
c = DateDiff("h", a, b) '1(時間)
c = DateDiff("n", a, b) '60(分)
c = DateDiff("s", a, b) '3600(秒)

'差分を時間で表示
a = CDate("17:0:0")
b = CDate("18:0:0")
c = TimeValue(CDate(b - a)) '1:00:00

'差分を時間で表示(日付をまたぐ)
a = CDate("2020/1/1 23:0:0")
b = CDate("2020/1/3 1:0:0")
c = Int(b - a) '1(日)
d = TimeValue(CDate(b - a)) '2:00:00

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

VBAで時間を比較する

時間を比較する方法をご紹介します。

時間を比較する場合は、文字列ではできません。

日付型の時間に変換して、比較演算子で比較します。

文字列で比較はできない

ためしに、文字列で時間を比較してみます。

時間『"17:0:0"』と『"17:00:01"』を比較してみます。

Sub TEST1()
    
    a = "17:0:0"
    b = "17:00:01"
    
    '比較する
    If a < b Then
        MsgBox b & "の方が大きい"
    Else
        MsgBox a & "の方が大きい"
    End If
    
End Sub

実行してみます。

文字列で時間を比較

文字列で時間を比較した結果

結果は、『17:0:0の方が大きい』となりました。

実際は、『"17:00:01"』の方が大きいので、間違いです。

文字列では、『"00"』と表現したり、『"0"』だけで表現してしまったりするので、正確には、時間を比較することはできません。

ちょっと、意地悪な例となりました。

日付型に変換して演算子で比較

時間を比較演算子で比較したい場合は、時間を日付型に変換するといいです。

先ほどと同じ例で、時間『"17:0:0"』と『"17:00:01"』を日付型に変換して、比較演算子で比較してみます。

日付型の時間に変換するには、『CDate』を使います。

Sub TEST2()
    
    a = CDate("17:0:0") '日付型に変換
    b = CDate("17:00:01") '日付型に変換
    
    '比較する
    If a < b Then
        MsgBox b & "の方が大きい"
    Else
        MsgBox a & "の方が大きい"
    End If
    
End Sub

実行してみます。

日付型で時間を比較

文字列を日付型の時間に変換して、比較演算子で比較した結果

結果は、『17:00:01の方が大きい』となりました。

正しく、時間を比較できています。

日付型の時間に変換できれば、簡単に比較できますので、時間を比較したい場合には、まず、日付型に変換しましょう。

VBAのDateDiffを使って2つの時間を比較して計算

2つの時間を比較して計算するには、DateDiffを使えばできます。

使い方(DateDiff)

DateDiffは、2つの時間の差分を取得することができます。

入力は、次のようにします。

『差分 = DateDiff(間隔, 時間1, 時間2)』

間隔には、次の引数を入れることができます。

  • 時:"h"
  • 分:"n"
  • 秒:"s"

という感じです。

差分の取り方は、時間2-時間1となります。

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

『時』の差分を取得

まず、2つの時間の差分を計算して、何時間の差があるかを計算してみます。

間隔として、『時』の差分が知りたいので、DateDiffの引数には『"h"』を入力します。

時間『"17:0:0"』と『"18:0:0"』の差分を『時』単位で取得するVBAコードです。

Sub TEST3()
    
    a = "17:0:0"
    b = "18:0:0"
    
    '『時』の差分を計算する
    c = DateDiff("h", a, b)
    
    MsgBox c
    
End Sub

実行してみます。

『時』で差分の計算

2つの時間の差分を『時』単位で取得した結果

結果は、『1』時間となりました。

時間『"17:0:0"』と『"18:0:0"』の差分は、『1』時間なので、正しく差分を計算できています。

『分』の差分を取得

つづいて、2つの時間の差分を計算して、何分の差があるかを計算してみます。

間隔として、『分』の差分が知りたいので、DateDiffの引数には『"n"』を入力します。

時間『"17:0:0"』と『"18:0:0"』の差分を『分』単位で取得するVBAコードです。

Sub TEST4()
    
    a = "17:0:0"
    b = "18:0:0"
    
    '『分』の差分を計算する
    c = DateDiff("n", a, b)
    
    MsgBox c
    
End Sub

実行してみます。

『分』で差分の計算

2つの時間の差分を『分』単位で取得した結果

結果は、『60』分となりました。

時間『"17:0:0"』と『"18:0:0"』の差分は、『60』分なので、正しく差分を計算できています。

『秒』の差分を取得

次は、2つの時間の差分を計算して、何秒の差があるかを計算してみます。

間隔として、『秒』の差分が知りたいので、DateDiffの引数には『"s"』を入力します。

時間『"17:0:0"』と『"18:0:0"』の差分を『秒』単位で取得するVBAコードです。

Sub TEST5()
    
    a = "17:0:0"
    b = "18:0:0"
    
    '『秒』の差分を計算する
    c = DateDiff("s", a, b)
    
    MsgBox c
    
End Sub

実行してみます。

『秒』で差分の計算

2つの時間の差分を『秒』単位で取得した結果

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

時間『"17:0:0"』と『"18:0:0"』の差分は、『3600』秒なので、正しく差分を計算できています。

こんな感じで、2つの時間を比較して差分を時、分、秒の単位で、取得したい場合に、DateDiffが使えます。

VBAで時間の差分を計算してCDateで日付型に変換

次は、時間の差分を計算して、日付型の時間で、差分を表示したい場合です。

例えば、時間『"17:0:0"』と『"18:0:0"』の差分を『"1:00:00"』というような感じで取得したい場合です。

時間の差分を計算してTimeValueで時間表示

時間の差分を計算して、時間表示にしてみます。

時間『"17:0:0"』と『"18:0:0"』の差分を計算して、時間表示にするVBAコードです。

Sub TEST6()
    
    a = CDate("17:0:0") '日付型に変換
    b = CDate("18:0:0") '日付型に変換
    
    '差分を計算
    c = b - a '⇒4.16666666666666E-02
    
    '日付型に変換
    d = CDate(c) '⇒1:00:00
    
    MsgBox d
    
End Sub

手順としては、

  • ①2つの時間を日付型に変換して、引き算をする
  • ②引き算の結果を日付型の時間に変換する

というような流れです。

では、実行してみます。

差分を時間表示

2つの時間の差分を計算して時間表示にした結果

結果は、『1:00:00』となりました。

時間の表示で、時間の差分を取得できました。

日付をまたぐ時間の差分

日付をまたぐ時間の差分はちょっと工夫が必要です。

時間『"2020/1/1 23:0:0"』と『"2020/1/3 1:0:0"』の差分を時間表示で、取得する方法です。

Sub TEST7()
    
    a = CDate("2020/1/1 23:0:0") '日付型に変換
    b = CDate("2020/1/3 1:0:0") '日付型に変換
    
    '差分を計算
    c = b - a '⇒1.08333333332848
    
    '整数の部分を取得(日数)
    d = Int(c) '⇒1
    
    '差分を日付型に変換
    e = CDate(c) '⇒1899/12/31 2:00:00
    
    '時間のみを取得
    f = TimeValue(e) '⇒2:00:00
    
    MsgBox d & "日と " & f & " の差です"
    
End Sub

手順としては、

  • ①日付+時間をCDateで日付型に変換
  • ②差分を計算する
  • ③差分から整数の部分をIntで取得(これが日数)
  • ④差分をCDateで日付型に変換
  • ⑤④からTimeValueで時間のみ取得(これが時間)

という流れです。

実行してみます。

日付をまたぐ時間の差分を時間表示

日付をまたぐ時間の差分を時間表示で取得する

結果は、『1 日と 2:00:00 の差です』となりました。

これで、2つの時間の差分を時間の表示で取得できました。

日付+時間の差分

日付の差分を計算すると、その結果は数値になります。

こんな感じです。

  • b - a ⇒ 1.08333333332848

日付の差分を取得

この数値で、整数の部分『1』が日付になります。

整数の値を、『Int』で取得すると、日付の差分が取得できます。

  • Int(1.08333333332848) ⇒ 1(日)

という感じです。

時間の差分を取得

また、小数点の部分『0.08333333332848』が時間になります。

小数点では、よくわからないので、ここは、VBA関数の出番です。

小数点『1.08333333332848』を、『CDate』を使って、日付型の時間に変換します。

  • CDate(1.08333333332848) ⇒ 1899/12/31 2:00:00

日付の部分は、使わないので、時間だけを『TimeValue』で取り出します。

  • TimeValue(1899/12/31 2:00:00) ⇒ 2:00:00

という感じです。

時間の計算はややこしいですね。

小数点の部分は、1時間:1/24、1分:1/24/60、1秒:1/24/60/60、だから、これを基に、計算すると。。。

という手もあります。

ただ、めんどくさいので、便利なVBA関数、CDateやTimeValue、Intを、効率的に使っていきましょう。

おわりに

この記事では、時間を比較して、計算する方法についてご紹介しました。

時間を比較したい場合には、まず、『CDate』で日付型に変換しましょう。

2つの時間の差分を計算したい場合は、『DateDiff』です。

時、分、秒の単位で、2つの時間の差分を計算できます。

2つの時間の差分を時間の表示で取得したい場合は、『TimeValue』です。

時間の計算ややこしいですね。

VBA関数を使って、効率的に時間の比較、計算をしていきましょう。

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

関連する記事から探す

カテゴリから探す

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

サイト内を検索する

↓キーワードを入力する

アーカイブから探す