こんにちは!ぐーです。
突然ですが、VBAでデータを処理していて、こんな経験はありませんか?
- 「日付で並び替えをしたのに、10月1日の次に11月ではなく、1月1日が来てしまう」
- 「日付の引き算(例:今日 – 期限日)をしようとしたら、エラーで止まる」
実はこれ、プログラムの記述ミスではなく、別の要因であることがほとんどです。原因の多くは、対象のデータが「日付の形式をしただけの文字列」として認識されていることにあります。
私たち人間の目には「2025/12/19」は日付に見えますが、パソコンにとっては「2」「0」「2」…というた記号の羅列、つまり単なる文字列として扱われている場合があります。
文字列の状態では、日付としての計算や正しい順序での並び替えが行えません。
この問題を解決するために、文字列を強制的に日付型(Date型)へ変換する関数、CDateとDateValueを活用します。
今回は、これら2つの関数の特徴と、状況に応じた使い分けについて詳しく解説します。
1. CDate と DateValue の決定的な違い
どちらも文字列を日付データに変換する役割を持ちますが、その処理範囲に違いがあります。
- DateValue関数:データから日付部分のみを抽出します。時刻の情報は含まれず、「0:00:00」として処理されます。
- CDate関数:日付や時刻、さらにはシリアル値など、日付として解釈可能なあらゆる形式を日付型へ変換する汎用性の高い関数です。
結論から言うと、迷ったら CDate を使っておけば間違いありません。
「時刻はいらない、日付だけで管理したい」という明確な意図がある時以外は、守備範囲の広いCDateを使うのがおすすめです。
2. そのまま使える!文字列を日付に変換する実践コード
では、実際にどう使うのか見てみましょう。
B列に入っている「日付っぽい文字列」を、C列に「本物の日付データ」として書き出すコードです。
Sub ConvertStringToDate()
' 変数の宣言
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim strDate As String
' シートの設定(アクティブなシート)
Set ws = ActiveSheet
' 最終行を取得(A列を基準)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' 2行目から最終行までループ
For i = 2 To lastRow
' B列の値(文字)を取得
strDate = ws.Cells(i, 2).Value
' 日付判定:もし日付に変換できるデータなら実行
If IsDate(strDate) Then
' CDateで変換してC列に入れる
ws.Cells(i, 3).Value = CDate(strDate)
' DateValue関数で変換する場合はこちらを使用(時間は消えます)
' ws.Cells(i, 3).Value = DateValue(strDate)
Else
ws.Cells(i, 3).Value = "変換不可"
End If
Next i
MsgBox "変換が完了しました!", vbInformation
End Sub
3. 予期せぬエラーを防ぐための注意点
CDateは非常に便利な関数ですが、変換できるのはあくまでシステムが日付として解釈可能な形式に限られます。
「2025年13月」のような存在しない日付や、「未定」といった日付とは無関係な文字列を変換しようとすると、型不一致のエラーが発生してしまいます。
これを防ぐために、上記のコードでも使用しているIsDate関数で事前に対象データが日付変換可能かどうかを判定するのが、堅牢なプログラムを作成するコツになります。
まとめ:正しい型変換でVBAのトラブルを防ごう
- 見た目が日付でも、中身が「文字列」だと集計できない。
- CDate は時間も含む万能変換、DateValue は日付のみ抽出。
- 変換前には IsDate でチェックするとエラー知らず。
これらのテクニックを活用すれば、 「並び替えがおかしい!」「計算できない!」というトラブルを未然に回避できるようになります。
ぜひ試してみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント