【ExcelVBA】日付を比較する方法!文字列の日付も対応可!

Excel VBAで日付を比較したいときはないでしょうか。

けど、そんな中で悩むことは、

・Excel VBAで日付を比較したいが方法がよくわからない
・Excel VBAで文字列の日付を比較したいが方法がよくわからない

ですよね。

今回はそんなお悩みを解決する

・Excel VBAで日付を比較する方法
・Excel VBAで文字列の日付を比較する方法

についてまとめます!

Excel VBAで扱う日付のデータ形式

Excel VBAで扱う日付のデータ形式は、日付と時間を数値で識別する数字になっています。

シートでは「1900/1/1 0:00:00」をVBAでは「1899/12/31 0:00:00」「1.0」として保持する数値で、整数部分が日付、小数点以下が時刻として扱われています。

例えば、A1セルに文字列「1」を入力し、Excel側の書式設定を日付にすると、

Excelシート側で文字列が日付表記に変換されます。

タカヒロ
タカヒロ
日付は表示上****年**月**日となっていても、裏では数字で扱われているという訳ですね。

Excel VBAの日付で扱える比較演算子

Excel VBAの日付で扱える比較演算子について説明をします。
比較演算子の一覧は以下の通りです。
内容は数字と同じように扱えます。なお、結果は Boolean(True/False)となります。

演算子 演算名
= 等しい
<> 等しくない
> 大きい
< 小さい
>= 以上
<= 以下

VBAで日付を比較する3パターン

日付を比較するVBAについて説明をします。
まずはワークシート関数で表示された日付をもとに比較をし、次に日付の文字列、最後に日付として認識されない文字列で日付の比較をしていきます。

ワークシート関数の日付を比較するVBA

データの準備

B1セルに本日の日付を算出するTODAY関数を入力します。

=TODAY()

なお、本日日付を取得する関数一覧は以下の通りです。

関数名 機能 書式
NOW 現在の日付と時刻に対応するシリアル値を返します。 =NOW()
TODAY 現在の日付に対応するシリアル値を返します。 =TODAY()

次にB3セルへ比較したい日付を手入力します。

VBAコード

サンプルのVBAコードは以下の通りです。

Sub 日付を比較する1()

    Dim dateTemp1 As Date
    Dim dateTemp2 As Date

    'セルの値を変数に代入します。
    dateTemp1 = Range("B1").Value
    dateTemp2 = Range("B3").Value

    '日付型のセルの値を比較します。
    If dateTemp1 > dateTemp2 Then
        Range("B5").Value = "本日より前"
    Else
        Range("B5").Value = "本日より後"
    End If
    
End Sub

VBAの実装

VBAの実装方法については
VBAの実装手順
をご参照ください。

VBAを実行する

VBAを実行してみましょう。

はい、B5セルに比較の結果が表示され、関数の結果でも問題なく比較ができることが確認できましたね。

VBAの説明

VBAについて説明をします。

比較元と比較先セルの値を変数に代入します。

dateTemp1 = Range("B1").Value
dateTemp2 = Range("B3").Value

日付型のセルの値を比較し、結果をB5セルへ出力します。

If dateTemp1 > dateTemp2 Then
Range("B5").Value = "本日より前"
Else
Range("B5").Value = "本日より後"
End If

文字列の日付を比較するVBA

文字列の日付を比較するVBAについて説明をします。

データの準備

D1セルに本日の日付を入力します。

令和4年8月2日


次にB3セルへ比較したい日付を手入力します。

VBAコード

サンプルのVBAコードは以下の通りです。

Sub 日付を比較する2()

    Dim strTemp1 As String
    Dim dateTemp2 As Date
    
    'セルの値を変数に代入します。
    strTemp1 = Range("D1").Text
    dateTemp2 = Range("B3").Value
    
    '日付型のセルの値を比較します。
    If strTemp1 > dateTemp2 Then
        Range("B5").Value = "本日より前"
    Else
        Range("B5").Value = "本日より後"
    End If
    
End Sub

VBAを実行する

VBAを実行してみましょう。

はい、B5セルに比較の結果が表示され、文字列の日付でも問題なく比較ができることが確認できましたね。

VBAの説明

VBAについて説明をします。

文字列を入れる変数はString型で定義します。

Dim strTemp1 As String
Dim dateTemp2 As Date

比較元と比較先セルの値を変数に代入します。文字列のセルの値はTextプロパティとなります。

strTemp1 = Range("D1").Text
dateTemp2 = Range("B3").Value

デバッグすると文字列が格納されている変数はString型であることがわかりますね。

でもString型でも比較演算子で判定する時点で日付型に変換されます。

If strTemp1 > dateTemp2 Then
Range("B5").Value = "本日より前"
Else
Range("B5").Value = "本日より後"
End If

タカヒロ
タカヒロ
String型でも一応は日付型としてみなされ比較演算が可能ですが、気持ち的には日付型にしっかりと変換した上で判定をしたいですね。

String型からData型に変換して比較するVBA

上記コードをすこし改良して、日付データをString型からData型に変換して比較するようにしたVBAのサンプルコードです。

Sub 日付を比較する3()

    Dim strTemp1 As Variant
    Dim dateTemp2 As Date

    'セルの値を変数に代入します。
    strTemp1 = Range("D1").Value
    '日付型に変換します。
    strTemp1 = CDate(strTemp1)
    dateTemp2 = Range("B3").Value

    
    '日付型のセルの値を比較します。
    If strTemp1 > dateTemp2 Then
        Range("B5").Value = "本日より前"
    Else
        Range("B5").Value = "本日より後"
    End If
    
End Sub

実行結果は前回と同様ですが、変数の型はしっかりとData型に変換されていますね。

以下を追加し、Cdate関数で文字列を日付型へ変換しています。

strTemp1 = CDate(strTemp1)

日付と認識できない文字列を日付として比較するVBA

日付と認識できない文字列を日付として比較するVBAについて説明をします。

データの準備

F1セルに本日の日付を表す整数をYYYYMMDD形式で入力します。

20220802

次にB3セルへ比較したい日付を手入力します。

VBAコード

サンプルのVBAコードは以下の通りです。

Sub 日付を比較する4()

    Dim strTemp1 As Variant
    Dim dateTemp2 As Date

    'セルの値を変数に代入します。
    strTemp1 = Range("F1").Value
    '日付形式の文字列に変換します。
    strTemp1 = Format(strTemp1, "####/##/##")
    'strTemp1 = Format(strTemp1, "0000/00/00")
    'セルの値を変数に代入します。
    strTemp1 = CDate(strTemp1)
    dateTemp2 = Range("B3").Value

    
    '日付型のセルの値を比較します。
    If strTemp1 > dateTemp2 Then
        Range("B5").Value = "本日より前"
    Else
        Range("B5").Value = "本日より後"
    End If
    
End Sub

VBAを実行する

VBAを実行してみましょう。

はい、B5セルに比較の結果が表示され、日付と判定されない文字列でも問題なく比較ができることが確認できましたね。

VBAの説明

VBAについて説明をします。

文字列を入れる変数は型が変換されるためVariant型で定義します。

Dim strTemp1 As Variant

Format関数で日付形式の文字列に変換します。

strTemp1 = Format(strTemp1, "####/##/##")

タカヒロ
タカヒロ
Format(strTemp1, “####/##/##”)の他、Format(strTemp1, “0000/00/00”)でも可能です。

なお、この処理を入れない場合はVBAで日付と判断できないので、「型が一致しません。」のエラーが発生します。

Format関数の戻り値は文字列であるため、 Cdate関数で日付型に変換し変数に代入します。

strTemp1 = CDate(strTemp1)

VBAの実装手順

実装手順は以下の通りです。

Excel側にVBAを実装していきます。

①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。

VBAを実行する

では早速VBAの実行をしてみましょう。

①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。

②処理がされたことが確認できれば完了です。

さいごに

いかがでしょうか。

今回は、

・Excel VBAで日付を比較する方法
・Excel VBAで文字列の日付を比較する方法

についてまとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。








コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です