「日付なのに並び替えができない!」を3秒で解決。文字列を日付型へ変換するCDateとDateValueの活用法

【業務効率化】VBA
スポンサーリンク

こんにちは!ぐーです。
突然ですが、VBAでデータを処理していて、こんな経験はありませんか?

  • 「日付で並び替えをしたのに、10月1日の次に11月ではなく、1月1日が来てしまう」
  • 「日付の引き算(例:今日 – 期限日)をしようとしたら、エラーで止まる」

実はこれ、プログラムの記述ミスではなく、別の要因であることがほとんどです。原因の多くは、対象のデータが「日付の形式をしただけの文字列」として認識されていることにあります。

私たち人間の目には「2025/12/19」は日付に見えますが、パソコンにとっては「2」「0」「2」…というた記号の羅列、つまり単なる文字列として扱われている場合があります。
文字列の状態では、日付としての計算や正しい順序での並び替えが行えません。 

この問題を解決するために、文字列を強制的に日付型(Date型)へ変換する関数、CDateとDateValueを活用します。

今回は、これら2つの関数の特徴と、状況に応じた使い分けについて詳しく解説します。

【業務効率化】VBAの記事を見る 

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の記事を見る 


VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でも、年間100万円以上の節約・資産管理・スキルアップで新NISAで年間360万円投資し、iDeCoもフル活用しています。日商簿記3級持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、稼ぐ力を高めるITスキルについて発信しています。

生活を豊かにしたくて、高配当株投資で年間配当金60万円をめざしています。現在は年間配当金25万円以上達成!

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【業務効率化】VBAITスキル
スポンサーリンク
ぐーをフォローする

コメント

タイトルとURLをコピーしました