VBAで自動化 VBA一覧 日付・時刻 配列・データ操作

【VBA】日付かどうか判定する方法|IsDate・CDate・DateValue・VarTypeの使い分け

VBAでデータを処理していると、「この値は日付として扱えるのか」を判定したい場面がよくあります。

例えば、

  • CSVから読み込んだデータ
  • ユーザーが入力した値
  • Excelセルの値
  • データベースから取得したデータ

などは、一見日付のように見えても、実際には文字列や数値として保持されていることがあります。

このような値をそのままCDateで変換するとエラーになったり、誤ったデータとして処理されたりする可能性があります。

実務では、型変換よりも先に「日付として扱えるか」を確認する設計が重要です。

VBAには日付判定に利用できるIsDate関数をはじめ、VarType関数・DateValue関数・CDate関数などがありますが、それぞれ役割は異なります。

この記事では、それぞれの特徴を比較しながら、実務ではどのように使い分けると安全なのかを解説します。

✅ 日付判定には複数の方法がある

「日付かどうか調べたい」と考えたとき、多くの人はIsDate関数を思い浮かべます。

しかし実務では、データの種類や取得元によって適切な判定方法が変わります。

例えば、

  • 入力値が日付として認識できるか確認したい
  • Variant型の中身を調べたい
  • 日付へ変換できるか試したい
  • 日付だけを取り出したい

など、目的によって使用する関数が異なります。

まずは、それぞれの役割を整理しましょう。

関数主な用途
IsDate日付として認識できるか判定する
VarTypeデータ型を調べる
CDate日付型へ変換する
DateValue日付部分だけ取得する

これらは似ているようで役割が異なるため、用途に応じて使い分けることが重要です。


✅ 日付判定ならまずIsDateを使う

日付判定で最も利用されるのがIsDate関数です。

指定した値が日付として解釈できる場合はTrue、そうでない場合はFalseを返します。

・もっとも安全に判定できる理由

例えば、ユーザー入力をそのまま日付へ変換すると、入力ミスがある場合に実行時エラーが発生する可能性があります。

その前にIsDateで判定しておけば、安全に処理を進められます。

Sub CheckDate()

    Dim inputValue As Variant

    inputValue = Range("A2").Value

    If IsDate(inputValue) Then
        MsgBox "日付として使用できます。"
    Else
        MsgBox "日付ではありません。"
    End If

End Sub

・実務で最初に使うべき関数

CSVやフォーム入力などでは、

  • 空白
  • 数値
  • 文字列
  • 日付

が混在していることも珍しくありません。

そのような場合でもIsDateならエラーにならず判定できます。

そのため、

「まずIsDateで確認する」

という流れが実務では基本になります。


✅ VarTypeは「日付型かどうか」を調べる関数

IsDateは「日付として解釈できるか」を判定します。

一方、VarTypeは「現在どのデータ型として保持されているか」を確認する関数です。

そのため、似ているようで用途は異なります。

・現在の型を確認したいときに使う

例えばVariant型には、

  • 数値
  • 文字列
  • 日付
  • Empty

など、さまざまな型が格納されます。

VarTypeを使えば、実際にどの型として保持されているか確認できます。

Sub CheckVarType()

    Dim inputValue As Variant

    inputValue = Range("A2").Value

    If VarType(inputValue) = vbDate Then
        MsgBox "Date型です。"
    Else
        MsgBox "Date型ではありません。"
    End If

End Sub

・IsDateとの違い

例えば、

セルに

2025/12/31

と入力されていても、

文字列として保持されている場合があります。

この場合、

  • IsDate → True
  • VarType → vbString

になります。

つまり、

IsDateは

「日付として扱える」

VarTypeは

「現在Date型なのか」

を調べています。

この違いを理解しておくと、デバッグやCSV処理で原因を見つけやすくなります。

VarType関数の戻り値や、各データ型の判定方法について詳しく知りたい方は、「【VBA】VarType 関数を使ってデータ型を調べる方法」で詳しく解説しています。


✅ CDateは判定ではなく変換する関数

CDateも日付処理でよく利用されますが、本来の目的は判定ではありません。

指定した値をDate型へ変換するための関数です。

・判定目的で使うべきではない理由

例えば、

Sub Sample()

    Dim inputValue As Variant

    inputValue = "ABC"

    MsgBox CDate(inputValue)

End Sub

このコードを実行すると、

実行時エラーになります。

つまり、

CDateは

「変換できるか調べる」

ための関数ではありません。

「変換する」

ための関数です。

・IsDateと組み合わせると安全

実務では次のように利用します。

Sub ConvertDate()

    Dim inputValue As Variant
    Dim targetDate As Date

    inputValue = Range("A2").Value

    If IsDate(inputValue) Then

        targetDate = CDate(inputValue)

        MsgBox targetDate

    Else

        MsgBox "日付へ変換できません。"

    End If

End Sub

このように、

最初にIsDateで判定してからCDateを実行すると、エラーを防ぎながら日付型へ変換できます。

CDateだけでなく、数値や文字列への型変換を含めた実務での使い分けについては、「【VBA】型変換(CInt/CLng/CStr/CDate)の使い分けと注意点|実務のデータ処理」で詳しく紹介しています。


 

✅ DateValueは日付部分だけ取得したい場合に使う

DateValueは、文字列や日時データから日付部分だけを取得する関数です。

そのため、IsDateやCDateとは目的が異なります。

・日時データから日付だけ取り出せる

例えば、

2025/7/29 18:30:45

というデータがある場合、

DateValueを使うと時刻を除いた日付だけ取得できます。

Sub GetDate()

    Dim targetDate As Date

    targetDate = DateValue("2025/7/29 18:30:45")

    MsgBox targetDate

End Sub

 

VBAでは日付と時刻はシリアル値として管理されています。時間の仕組みまで理解したい方は、「【VBA】時間の計算方法:シリアル値」もあわせてご覧ください。

・日付判定には向かない

DateValueも変換処理を行うため、

変換できない文字列ではエラーになります。

そのため、

DateValue単体で判定処理を書くのではなく、

IsDateで確認したあとに利用する方が安全です。

ここまでで、それぞれの関数の役割が見えてきました。

  • IsDate:日付として扱えるか判定する
  • VarType:現在のデータ型を確認する
  • CDate:Date型へ変換する
  • DateValue:日付部分だけ取得する

どれも日付処理で利用されますが、目的はそれぞれ異なります。実務では役割を理解した上で使い分けることが、エラーの少ないマクロにつながります。

✅ 実務では「判定」と「変換」を分けて設計する

日付を扱うマクロでは、「判定」と「変換」を同じ処理の中で行わないことが重要です。

例えば、セルの値をそのままCDateで変換すると、日付ではないデータが含まれていた場合に実行時エラーが発生します。

実務ではCSVやユーザー入力など、データの内容を保証できないケースが多いため、まず日付として扱えるかを確認し、その後でDate型へ変換する流れが安全です。

・エラーを防ぎながら日付へ変換する設計

次のコードでは、IsDateで判定した後にCDateで変換しています。

変数名も役割が分かるようにし、判定と変換を明確に分けています。

Option Explicit

Public Sub ConvertInputDate()

    Dim inputValue As Variant
    Dim convertedDate As Date

    'セルの入力値を取得
    inputValue = ThisWorkbook.Worksheets("Sheet1").Range("A2").Value

    '日付として扱える場合のみ変換する
    If IsDate(inputValue) Then

        convertedDate = CDate(inputValue)

        MsgBox "変換結果:" & Format(convertedDate, "yyyy/mm/dd")

    Else

        MsgBox "日付として認識できません。"

    End If

End Sub

・なぜこの書き方にするのか

このコードでは、「判定」と「変換」を分離しています。

例えば次のような書き方もできます。

targetDate = CDate(Range("A2").Value)

コードは短くなりますが、日付以外の値が入力された瞬間にエラーになります。

一方、最初にIsDateで確認しておけば、正常なデータだけを変換できます。

実務では「エラーにならないこと」よりも、「想定外のデータが来ても安全に処理を続けられること」の方が重要です。

そのため、判定と変換を分ける設計が保守しやすいコードにつながります。


✅ CSVやユーザー入力ではIsDateが特に重要

CSVファイルや入力フォームでは、入力されるデータを完全に信用することはできません。

例えば、次のような値が混在することがあります。

  • 2025/07/29
  • 2025-07-29
  • 2025年7月29日
  • 空白
  • 未入力
  • ABC

これらをそのままCDateへ渡すと、途中でエラーになり処理全体が停止する可能性があります。

・入力チェックを先に行う

例えばCSVを1行ずつ読み込む場合でも、最初にIsDateで判定しておけば、不正なデータだけを除外できます。

If IsDate(csvValue) Then

    targetDate = CDate(csvValue)

Else

    'ログへ出力するなど必要な処理

End If

入力チェックを最初に行うことで、

  • エラー停止を防ぐ
  • 不正データだけ記録する
  • 後続処理を継続できる

というメリットがあります。

大量データを扱う実務では、この考え方が非常に重要です。

日付判定を行わずに型変換すると、「型が一致しません」などの実行時エラーが発生することがあります。代表的な原因と対処法は、「【VBA】『型が一致しません』エラーに対処する方法|原因別に完全解説」で紹介しています。


 

✅ VarTypeはデバッグでも役立つ

VarTypeは日付判定よりも、データの状態を確認したい場面で活躍します。

特にCSVやVariant型を扱うマクロでは、

「見た目は日付なのに処理できない」

というケースがあります。

・型を確認すると原因を見つけやすい

例えば、

Debug.Print VarType(targetValue)

を実行すると、

値が

  • Date型なのか
  • String型なのか
  • Emptyなのか

を確認できます。

IsDateだけではTrueになるため原因が分からない場合でも、VarTypeを確認すると、実際には文字列として保持されていることが分かる場合があります。

・デバッグ用途として覚えておく

普段のマクロではIsDateを使用し、

「なぜ期待どおり動かないのか」

を調査するときにVarTypeを利用すると、原因を見つけやすくなります。

そのため、VarTypeは判定関数というより、デバッグを補助する関数として覚えておくと実務で役立ちます。


✅ DateValueは日時データを整理したいときに便利

DateValueは判定ではなく、日時データから日付部分だけを取り出したい場合に適しています。

例えば、システムから取得した日時データでは、

2025/07/29 15:42:31

のように時刻まで含まれていることがあります。

このまま比較すると、

If targetDate = Date Then

が期待どおり動かないことがあります。

・比較しやすい日付へ変換する

そのような場合はDateValueを利用します。

If DateValue(targetDateTime) = Date Then

    MsgBox "本日のデータです。"

End If

日時ではなく日付だけで比較したい場合は、このようにDateValueを利用すると分かりやすいコードになります。

ただし、DateValueも変換関数です。

日付として認識できない値ではエラーになるため、入力データが不確かな場合はIsDateと組み合わせて使用しましょう。

日付データを取得した後に「yyyy/mm/dd」など任意の表示形式へ整えたい場合は、「【VBA】Format関数で文字列に変換する方法|日付・数値・表示形式を完全整理」も参考にしてください。


✅ 日付判定でよくある実務上の失敗

日付判定のマクロでは、構文よりも「データの状態」を想定していないことが原因で不具合になるケースが多くあります。

・CDateだけで変換してしまう

もっとも多い失敗は、

targetDate = CDate(inputValue)

だけで処理してしまうことです。

テストデータでは問題なく動いても、本番では空白セルや入力ミスが含まれ、突然エラーになることがあります。

まずIsDateで判定する流れを習慣にしましょう。

・VarTypeだけで日付判定してしまう

VarTypeはDate型かどうかを調べる関数です。

そのため、

"2025/07/29"

という文字列は、

日付として利用できてもString型です。

その結果、

If VarType(value) = vbDate Then

ではFalseになります。

「日付として使えるか」を調べるなら、VarTypeではなくIsDateを使用します。

・地域設定によって結果が変わる

日付の解釈はWindowsの地域設定に影響されることがあります。

例えば、

01/02/2025

というデータは、

環境によって

  • 1月2日
  • 2月1日

のどちらとして扱われるか変わる可能性があります。

CSVなど外部データを扱う場合は、

yyyy/mm/dd

のように年月日を明確にした形式を利用すると、誤判定を防ぎやすくなります。


✅ 用途ごとの使い分け早見表

ここまで紹介した関数を整理すると、次のようになります。

やりたいこと使用する関数
日付として使えるか確認したいIsDate
現在のデータ型を確認したいVarType
Date型へ変換したいCDate
日付部分だけ取得したいDateValue

同じ日付処理でも、目的によって適切な関数は異なります。

役割を理解して使い分けることで、読みやすく保守しやすいコードになります。

日付を安全に判定・変換できるようになったら、月末日や締め日の自動計算にも応用できます。「【VBA】月の最終日を簡単に求める方法|DateSerialで月末処理を安全に自動化」もぜひ参考にしてください。


 

✅ まとめ

VBAで日付を扱う場合は、「判定」と「変換」を明確に分けることが、安全なマクロを作るポイントです。

今回紹介した内容をまとめると、次のようになります。

  • 日付として扱えるか確認するならIsDateを使う
  • 現在のデータ型を確認するならVarTypeを使う
  • Date型へ変換する場合はCDateを使う
  • 日付部分だけ取得したい場合はDateValueを使う
  • CDateやDateValueは判定関数ではないため、IsDateと組み合わせると安全
  • CSVやユーザー入力では判定を先に行うことで実行時エラーを防げる
  • 地域設定の違いを考慮し、日付形式は統一する

実務では「どの関数を使うか」よりも、「どのタイミングで使うか」が重要です。

まずIsDateで入力値を確認し、その後にCDateやDateValueで必要な処理を行うという流れを意識すると、エラーに強く再利用しやすいVBAコードになります。

    -VBAで自動化, VBA一覧, 日付・時刻, 配列・データ操作