文字列から日付(Date型)への変換
このページでは日付形式の文字列から日付(Date型)への変換について紹介しています。
日付形式の文字列にはyyyy/mm/dd形式やyyyymmdd形式など表現方法がいくつかありますが、そのままDate型に変換できるものとそうでないものがあります。
それらについて以下に整理します。
なお、それとは逆の、日付から文字列への変換は「VBAで日付(Date型)から文字列に変換する」をご参照ください。
yyyy/mm/dd形式はそのままCDate関数で変換する
スラッシュ区切りの年月日の文字列はそのままCDate関数でDate型に変換できます。
1 2 3 4 5 6 7 8 |
Sub StringToDate1() Dim s As String Dim dt As Date s = "2018/03/29" dt = CDate(s) End Sub |
yyyymmdd形式はyyyy/mm/ddにしてからCDate関数で変換する
8文字の数字で日付としてみなされる形になっている場合は、そのままではDate型には変換できません。
そのため、文字列の年・月・日の各部分を分けてスラッシュ等で区切り、yyyy/mm/dd形式の文字列にした上でCDate関数で変換する必要があります。
以下の例ではFormat関数でスラッシュ区切りに変換してCDate関数で変換する方法と、Mid関数で年・月・日のそれぞれを切り出してスラッシュ文字を連結してCDate関数で変換する方法の2つ挙げています。
Format関数の####/##/##の#は数字1文字を表します。
Format関数とMid関数のどちらの書き方でも構いません。
1 2 3 4 5 6 7 8 9 10 |
Sub StringToDate1() Dim s As String Dim dt As Date s = "20180329" dt = CDate(Format(s, "####/##/##")) '// こちらでもよい ' dt = CDate(Mid(s, 1, 4) & "/" & Mid(s, 5, 2) & "/" & Mid(s, 7, 2)) End Sub |
IsDate関数の拡張関数
Date型に変換できるかどうかを判定するためのIsDate関数があります。
yyyy/mm/dd形式は変換できるとみなされますが、yyyymmddは変換できないと判定されます。
しかも、”0002017/08/31″という文字列の場合は変換できるとみなされ、「えー!?」と思わされる挙動をします。
個人的にはちょっと不便だと感じます。
これらを解消した関数を「8桁日付やスラッシュ編集日付用のIsDate関数」にて紹介しています。