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コードになります。