銀河鉄道

【VBA】文字列を日付型に変える|CDateよりDateSerial

サムネイル
[VBA]Convert stringto Date
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

Vocabulary

| Parse|解析する |
| Verify|検証する |
| DateSerial|日付生成関数 |
| Input Validation|入力検証 |
| Immediate Window|イミディエイトウィンドウ |

逆パターンはこちら

Never trust string shape—always parse and verify.

同じ処理をPythonでも書いてみよう

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧