【VBAリファレンス|実務向け】実務で必須!文字列の日付を日付データ(シリアル値)に変換するテクニック

スポンサーリンク

導入:なぜ「日付の文字列」がトラブルの元なのか

実務において、他部署や外部から送られてくるExcelデータには、日付が「文字列」として入力されていることが多々あります。「2023/10/01」と見えていても、Excelがそれを数値として認識していない場合、並び替えがうまくいかなかったり、計算式でエラーが出たりと、業務効率を下げる大きな原因となります。これを解決し、日付として正しく認識させる「シリアル値」への変換スキルは、Excelを扱う上での必須教養です。

基礎知識:シリアル値とは何か

Excelにおいて、日付や時刻は「シリアル値」という数値で管理されています。これは「1900年1月1日」を「1」とし、1日経過するごとに1ずつ増える通し番号のことです。
文字列の状態では単なる「文字」の集まりですが、シリアル値に変換することで、足し算や引き算、期間の計算が可能になります。また、表示形式を自由に変更(例:2023年10月1日、10/01など)できるようになります。

実装・解決策:DATEVALUE関数とVBAでの変換

Excelの一般機能としては、DATEVALUE関数を使用するのが最も手軽です。
書式:=DATEVALUE(文字列)
この関数を使うと、日付として解釈可能な文字列をシリアル値に変換できます。

しかし、VBAで大量のデータを処理する場合、関数をセルに埋め込むよりも、VBAの「CDate関数」や「DateValue関数」を使って、直接値(Value)を変換する方が高速かつスマートです。

サンプルプログラム:文字列を一括で日付型に変換するVBA

以下のコードは、選択範囲内にある「日付に見える文字列」を一括で日付データに変換する実用的なマクロです。

Sub ConvertStringToDate()
‘ 選択範囲の各セルに対して処理を行う
Dim cell As Range

‘ エラーハンドリング(変換できない文字列がある場合のため)
On Error Resume Next

For Each cell In Selection
‘ セルに値があり、かつ日付として解釈可能かチェック
If IsDate(cell.Value) Then
‘ 日付に変換してセルに書き戻す
cell.Value = CDate(cell.Value)
‘ 日付用の表示形式を設定
cell.NumberFormatLocal = “yyyy/mm/dd”
End If
Next cell

On Error GoTo 0
MsgBox “変換が完了しました。”
End Sub

応用・注意点:現場で陥りやすい罠

1. エラー値の扱い:「2023年13月1日」のような存在しない日付や、完全に文字だけのセルに対して変換を行うと、エラーが発生します。プログラムを組む際は、必ずIsDate関数で「日付として扱えるか」を事前に判定することが重要です。
2. 年が省略されている場合:参考本文にもある通り、年が省略されている場合、Excelは「現在の年」を補完して変換します。過去や未来のデータを扱う際は、意図しない年にならないか注意が必要です。
3. 表示形式の罠:変換しても見た目が変わらない場合は、セルの「表示形式」が「文字列」のままになっていることがあります。値を変換した後は、必ず表示形式を「日付」に設定し直すか、上記サンプルコードのようにVBAで明示的に指定するようにしましょう。

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