文字列から日付(Date型)への変換
このページでは日付形式の文字列から日付(Date型)への変換する方法を解説します。
日付形式の文字列には「yyyy/mm/dd」形式や「yyyymmdd」形式など表現方法がいくつかありますが、そのままDate型に変換できるものとそうでないものがあります。
この記事では、主に次のような変換方法について紹介します。
- yyyy/mm/dd 形式の文字列を直接CDate関数で変換する方法
- yyyymmdd形式の文字列を加工してから変換する方法
- 変換可否を判定するIsDate関数の注意点と補完方法
なお、それとは逆の、日付から文字列への変換は「VBAで日付(Date型)から文字列に変換する」をご参照ください。
【パターン1】スラッシュ付きの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 |
【パターン2】yyyymmdd形式はyyyy/mm/ddに加工してからCDate関数で変換する
「20180329」のように8文字の数字で日付を表す文字列は、そのままではDate型には変換できません。そのため、文字列の年・月・日に分解して「yyyy/mm/dd」形式に変換してからCDate関数で変換する必要があります。
次の2通りの方法があります。
方法1:Format関数を使う
1 2 3 4 5 6 7 |
Sub StringToDate1() Dim s As String Dim dt As Date s = "20180329" dt = CDate(Format(s, "####/##/##")) '// #は数字1文字を表す End Sub |
方法2:Mid関数で年・月・日を切り出す
1 2 3 4 5 6 7 |
Sub StringToDate1() Dim s As String Dim dt As Date s = "20180329" dt = CDate(Mid(s, 1, 4) & "/" & Mid(s, 5, 2) & "/" & Mid(s, 7, 2)) End Sub |
どちらの方法でも同じ結果になります。どちらを使ってもOKです。
IsDate関数の拡張関数
VBAには、文字列が日付に変換可能かどうかを判定するIsDate関数があります。
たとえば「2018/03/29」は True を返しますが、「20180329」は False になります。また、「0002017/08/31」のような変な文字列でも True を返すことがあり、意図しない判定をする場合があります。
個人的にはちょっと不便だと感じます。
このような不便さを解消するために、独自の判定ロジックを備えた関数を「8桁日付やスラッシュ編集日付用のIsDate関数」にて紹介しています。併せてごらんください。