CDate関数とは
CDate関数は、VBAで文字列や数値を日付型(Date型)に変換するための組み込み関数です。
VBAでプログラミングしていると、文字列として扱っている日付や、数値として渡される時刻を「日付型(Date型)」として利用したい場面が多くあります。
たとえば、ユーザーが入力した “2025/10/05” という文字列を日付として計算したり、データベースから取得した数値を日付に変換して処理するケースです。
このようなときに必要になるのがCDate関数です。以下に詳しく説明します。
構文
Function CDate(expression)
戻り値 | Date型(日付型)のデータを返します。 |
Expression | 日付や時刻に解釈可能な文字列または数値を指定します。
一般的には日付を表す“yyyy/mm/dd”形式や、日時を表す“yyyy/mm/dd hh:mm:ss”形式の文字列がよく使われます。 |
基本的な使い方
1. 日付文字列をCDate関数で日付に変換
日付文字列には”yyyy/mm/dd”(スラッシュ区切り)、”yyyy-mm-dd”(ハイフン区切り)、”mm/dd/yyyy”(海外表記)などの形式がありますが、これらの書式の文字列をDate型に変換します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub CDateBasicExample() Dim dateValue As Date '// 文字列を日付に変換 dateValue = CDate("2024/12/25") Debug.Print dateValue ' 2024/12/25 '// 別の形式 dateValue = CDate("2024-12-25") Debug.Print dateValue ' 2024/12/25 '// 月/日/年の形式(システム設定による) dateValue = CDate("12/25/2024") Debug.Print dateValue ' 2024/12/25 End Sub |
実行結果
2024/12/25
2024/12/25
2024/12/25
日本語環境では “2025/10/05” や “2025-10-05” のようなスラッシュ区切りやハイフン区切り形式を正しく日付として解釈します。
2. 日付+時刻文字列をCDate関数で日時に変換
“yyyy/mm/dd hh:mm:ss”での日時もCDate関数でDate型に変換できます。
1 2 3 4 5 6 7 8 9 10 11 |
Sub CDateWithTime() Dim dateTimeValue As Date '// 日付と時刻を含む文字列 dateTimeValue = CDate("2024/12/25 14:30:00") Debug.Print dateTimeValue '// 2024/12/25 14:30:00 '// 時刻のみ dateTimeValue = CDate("14:30:00") Debug.Print dateTimeValue '// 14:30:00(日付部分は今日の日付) End Sub |
実行結果
2024/12/25 14:30:00
14:30:00
時刻だけを渡すと、その日のシステム日付に時刻が付与されます。
3. 数値を日付に変換
Excel内部では、日付を「シリアル値」という数値で管理しています。
1900年1月1日を「1」とし、以降1日ごとに1ずつ加算される仕組みです。その数字もCDate関数でDate型に変換できます。
1 2 3 4 5 |
Sub CDateSerialNumber() Dim s As Date s = CDate(45200) Debug.Print s '// 2023/10/05 End Sub |
実行結果
2023/10/01
数値を渡すと、Excelの日付シリアル値として解釈されます。
CDateの注意点
1. 環境依存(日付書式の違い)
CDateはOSのロケール設定に依存します。
日本の環境では “2025/10/05″ を「2025年10月5日」と解釈します。また、”10/05/2025” は「月/日/年」形式と認識されることがあります。
CDate関数はこのような書式の違いを考慮してはくれますが、変換誤りを防ぐために、文字列の日付を扱う場合は国際的に曖昧さの少ない形式(yyyy/mm/dd) を使うことをおすすめします。
2. 数値変換の落とし穴
数値を渡すとシリアル値として変換されますが、「ユーザーが入力した数値」が必ずしも日付シリアル値を意味するとは限りません。
たとえば「20251005」をCDateに渡すと、想定外の結果になります。
1 |
Debug.Print CDate(20251005) ' -> 2070/09/07 |
3. エラー13:型が一致しません
エラー13は、CDate関数が日付として認識できない値を変換しようとしたときに発生します。
以下の関数は”これは日付ではありません”という文字列をCDate関数で変換しようとして変換できないためエラーになりMsgBoxを表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub HandleTypeError() Dim dateValue As Date Dim testValue As String testValue = "これは日付ではありません" On Error GoTo ErrorHandler dateValue = CDate(testValue) Debug.Print dateValue Exit Sub ErrorHandler: If Err.Number = 13 Then MsgBox "入力値を日付に変換できません: " & testValue End If End Sub |
安全に使う方法
IsDate関数と組み合わせる
文字列や数値をCDateで変換する前に、IsDate関数で判定しておくと安全です。仕事で扱うなどの厳密なコードであればIsDate関数との組み合わせは必須と言ってもいいほどです。
以下の関数は入力ダイアログを表示し、yyyy/mm/dd形式で入力してOKを押すと、IsDate関数で日付として問題ないか確認を行い、問題が無ければCDate関数で変換を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub UseIsDateFirst() Dim inputValue As String Dim dateValue As Date inputValue = InputBox("日付を入力してください") If IsDate(inputValue) Then dateValue = CDate(inputValue) MsgBox "変換成功: " & Format(dateValue, "yyyy年mm月dd日(ddd)") Else MsgBox "日付として認識できません" End If End Sub |
これにより、予期せぬエラーを防止できます。
CDateを使った活用例
1. 日付の計算
CDateで文字列を日付に変換すれば、加算・減算が可能です。
1 2 3 4 5 6 7 |
Sub DateCalcTest Dim d As Date d = CDate("2025/10/05") Debug.Print d + 7 '// 2025/10/05に7日加算 -> 2025/10/12 Debug.Print d - 1 '// 2025/10/05から1日減算 -> 2025/10/04 End Sub |
実行結果
2025/10/12
2025/10/04
2. 時刻の計算
CDateで時刻に変換後に、TimeSerial関数で時刻を加算します。
1 2 3 4 5 6 |
Sub TimeCalcTest Dim t As Date t = CDate("12:00:00") Debug.Print t + TimeSerial(2, 30, 0) '// 12:00:00 に2時間30分0秒を加算 -> 14:30:00 End Sub |
実行結果
14:30:00
3. 日付範囲の検証
以下は、第一引数で渡された日付文字列が、第二引数、第三引数の日付文字列範囲に含まれているかを判定する関数です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Function IsDateInRange(dateStr As String, startDate As Date, endDate As Date) As Boolean Dim checkDate As Date On Error GoTo ErrorHandler checkDate = CDate(dateStr) If checkDate >= startDate And checkDate <= endDate Then IsDateInRange = True Else IsDateInRange = False End If Exit Function ErrorHandler: IsDateInRange = False End Function |
1 2 3 4 5 |
Sub TestDateRange() Dim result As Boolean result = IsDateInRange("2024/12/25", #1/1/2024#, #12/31/2024#) Debug.Print result '// True End Sub |
実行結果
True
まとめ
CDate関数は文字列を日付型に変換できる有用な関数ですが、以下の点に注意して使用しましょう。
- エラー処理を必ず実装する:無効な日付文字列でエラーが発生するため
- IsDate関数で事前チェック:変換可能かを確認してから使用
- 日付形式の統一:yyyy-mm-dd形式が地域設定に依存せず安全
以下のようにIsDate関数とCDate関数を組み合わせるコードが推奨されます。
1 2 3 4 5 6 |
If IsDate(inputValue) Then dateValue = CDate(inputValue) '// 処理を続行 Else '// エラー処理 End If |
この形はどの場面でも利用できますので、ご活用ください。