IsDate
IsDate関数はCDate関数でDate型に変換できる値であるかをチェックします。Date型は日付だけでなく時刻も含んでいるため、日付や時刻として正しい場合はTrueを返し、そうでない場合はFalseを返します。
「IsDate」という名前なのに時刻もチェック対象にするところはVBAの設計が良くない点の1つですね。
構文
1 |
Function IsDate(expression) As Boolean |
expression | CDate型に変換できるか判定したい文字列を指定します。 |
Boolean(戻り値) | 日付の場合、Trueと判定される範囲は西暦100年1月1日から9999年12月31日までです。
年が2桁以下の場合は、Windowsのシステムの設定(後述)により異なりますが、通常は0年1月1日から29年12月31日は2000年1月1日から2029年12月31日とみなし、30年1月1日から99年12月31日は1930年1月1日から1999年12月31日とみなされます。 時刻の場合、Trueと判定される範囲は0時0分0秒から23時59分59秒までです。 いずれもその範囲外はFalseを返します。 |
2桁以下の年度
2桁以下の年度はWindowsのシステムの設定で4桁の西暦に変換されます。
初期状態では0から29は2000年から2029年、30から99は1930年から1999年として解釈されます。
その設定はWindows7であれば、コントロールパネル→地域と言語→追加の設定→形式のカスタマイズ→日付タブ→カレンダー の「2桁の数字で年を入力すると、次の範囲内での暦年として解釈する」の年度、で変更可能です。
サンプルコード
いくつかの日付と時刻のパターンをそれぞれ実行するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub IsDatePatternTest() Dim b Dim ar() Dim i ReDim ar(7) ar(0) = "2017/1/31" ar(1) = "000000002017/0000000003/00000025" ar(2) = "23:59:59" ar(3) = "0000023:0000059:0000059" ar(4) = "年月日" ar(5) = "2017年1月31日" ar(6) = "23時1分59秒" ar(7) = "24時0分0秒" For i = 0 To UBound(ar) b = IsDate(ar(i)) Debug.Print ar(i); " : " & b Next End Sub |
実行結果
1 2 3 4 5 6 7 8 |
2017/1/31 : True 000000002017/0000000003/00000025 : True 23:59:59 : True 0000023:0000059:0000059 : True 年月日 : False 2017年1月31日 : True 23時1分59秒 : True 24時0分0秒 : False |
この結果の通り、「000000002017/0000000003/00000025」こういうのも日付としてOKと判定されます。
IsDate関数のあいまい判定を無くす方法
上記の通り、IsDate関数は日付としておかしいものも正常とみなすところがあります。また、そもそも時刻は正常とみなしてほしくない場合もあります。
このような場合、IsDate関数をそのままチェックに使うことは当然できませんのでなんらかの対策が必要になります。
そのようなIsDate関数の編集が必要な場合は「8桁日付やスラッシュ編集日付用のIsDate関数」にIsDate関数を8桁の日付文字列(20171130)や区切り文字ありの日付(2017/11/30や2017-11-30)の場合のみ、Trueを返すプログラムを紹介しています。