【VBA】文字列を日付型に変える|CDateよりDateSerial
作成日:2022-11-01
更新日:2025-10-06

DateSerial を
使う
使う
文字列を日付に変える
' Convert string to Date safely|安全に文字列を日付型に変換
Public Function CreateDateFromStr(ByVal v As String) As Date
Dim y As Long, m As Long, d As Long
Dim parts() As String
' Normalize delimiters|区切り文字を統一
v = Replace(Replace(v, "-", "/"), ".", "/")
parts = Split(v, "/")
If UBound(parts) = 2 Then
y = CLng(parts(0))
m = CLng(parts(1))
d = CLng(parts(2))
' Validate date|日付の妥当性を検証
If IsDate(DateSerial(y, m, d)) Then
CreateDateFromStr = DateSerial(y, m, d)
Else
Err.Raise vbObjectError + 1, , "不正な日付です: " & v
End If
Else
Err.Raise vbObjectError + 2, , "日付形式が不正です: " & v
End If
End Function
DateSerial
が 自動補正をしない から、「13月」「40日」も検出できるCDate
単体より、誤変換に弱くない
Example|使用例
Sub Test_CreateDateFromStr()
Dim s As String
Dim d As Date
' パターン1:スラッシュ区切り
s = "2025/10/06"
d = CreateDateFromStr(s)
Debug.Print s, "→", d ' → 2025/10/06
' パターン2:ハイフン区切り
s = "2025-10-06"
d = CreateDateFromStr(s)
Debug.Print s, "→", d ' → 2025/10/06
' パターン3:ドット区切り
s = "2025.10.06"
d = CreateDateFromStr(s)
Debug.Print s, "→", d ' → 2025/10/06
' パターン4:月・日が一桁
s = "2025/1/6"
d = CreateDateFromStr(s)
Debug.Print s, "→", d ' → 2025/01/06
' ❌ パターン5:不正日付
s = "2025/13/40"
d = CreateDateFromStr(s) ' → エラー発生(不正な日付です)
End Sub
出力結果(Immediateウィンドウ)
2025/10/06 → 2025/10/06
2025-10-06 → 2025/10/06
2025.10.06 → 2025/10/06
2025/1/6 → 2025/01/06
最後の "2025/13/40"
は Err.Raise
によって
「不正な日付です: 2025/13/40」 というメッセージで止まる
CDate(Format(v, "####/##/##"))
が不正確な理由
Formatは文字列を日付として保証しない
例えば "2025106"
を渡したら "2025106"
のまま返る。
そのあと CDate
が "2025106"
を「2025年10月6日」と解釈してくれる保証がない。
場合によっては「エラー」や「不正な日付」になる。
月や日が1桁のときにフォーマットがずれる|ゼロ詰めをしない
"2025/1/6"
→ Format("2025/1/6", "####/##/##")
は "2025/01/06"
にならず "2025/1/6"
のまま。
Formatは「桁数指定」じゃなく「表示フォーマット」だから、ゼロ詰めはしない。
安全に使うなら、日付文字列の正規化+検証
Referenced Insights
- Microsoft Docs: Format function (VBA)
- Microsoft Docs: CDate function (VBA)
Vocabulary
| Parse|解析する |
| Verify|検証する |
| DateSerial|日付生成関数 |
| Input Validation|入力検証 |
| Immediate Window|イミディエイトウィンドウ |

逆パターンはこちら
Never trust string shape—always parse and verify.

同じ処理をPythonでも書いてみよう
2022-11-01
編集後記:
この記事の内容がベストではないかもしれません。
記事一覧
-
時間計算のDateAdd 【VBA】DateAddで時間の足し算・引き算 -
ユーザーフォームを半透明にする 【VBA】ユーザーフォームを半透明にしてシートの内容が見えるようにする|waiting-form -
[VBA]開いているかwith FullName 【VBA】ブックが開いているか判定|StrComp で FullNameを調べる -
Excel内でSQLを使いたい 【VBA】Excelシート内の表データをSQLで操作したい -
[VBA]Vertical Paste1D array 【VBA】一次元配列を縦方向にシートに貼り付け【範囲をリサイズする】 -
[VBA]開いていたら閉じる 【VBA】指定のブックが開いていたら閉じる