VBAの「IsDate」関数で、文字列が日付として妥当か?というチェックをするのですが、
どんな文字列が妥当なのか、という情報が少なかったのでメモです。
スラッシュ区切り、ハイフン区切り、ピリオド区切りなど、下で試していますのでご参考になれば幸いです。
実際に動作させてチェック
チェック用のコードはこちら。
Sub test() Dim dt(9) As String, dtn As Variant, i As Long dt(0) = "2019/01/27" dt(1) = "2019年1月27日" dt(2) = "2019-1-27" dt(3) = "2019-01-27" dt(4) = "January 27,2019" dt(5) = "JANUARY 27 2019" dt(6) = "平成31年1月27日" dt(7) = "平成31年1/27" dt(8) = "2019.1.27" dt(9) = "20190127" dtn = 20190127 For i = 0 To 9 Cells(i + 2, 1).NumberFormatLocal = "@" Cells(i + 2, 1) = dt(i) Cells(i + 2, 2) = IsDate(dt(i)) If IsDate(dt(i)) = True Then Cells(i + 2, 3) = CDate(dt(i)) Else Cells(i + 2, 3) = "変換できません" End If Next Cells(i + 2, 1) = "Formatで変換" Cells(i + 2, 2) = IsDate(Format(dtn, "####/##/##")) 'Cells(i+2, 2) = CDate(dtn) オーバーフロー Cells(i + 2, 3) = CDate(Format(dtn, "####/##/##")) End Sub
実行結果
解説
2019/01/27(スラッシュ区切り)→OK
典型的な日付文字列ですね。
2019年1月27日(日本語表記)→OK
日付文字列として妥当だということです。日本語版以外で動作するのかは不明です(たぶんだめ)
2019-1-27(ハイフン区切り)→OK
非常に違和感があるのですが、ハイフン区切りでも日付文字列として大丈夫な模様。
January 27,2019(英語表記)→OK
おそらくこの英語表記は、どの言語版のExcel VBAでも大丈夫でしょう。
平成31年1月27日(元号表記)→OK
元号表記も日付文字列として許容されますが、平成31年1/27のようにミックスするとダメな模様。
2019.1.27(ピリオド区切り)→ダメ!
ハイフンが良いならピリオドでもいいじゃないか! とExcelに愚痴をこぼしたことがある方は多いはず。ピリオド区切りは日付じゃないということなので、発見したらReplace関数でスラッシュに置き換えてあげるしかないですね。
20190127(連続表記)→ダメ!
同じく、ダメな理由などないのでしょうが、8ケタの連続表記も日付ではないそうです。なので、サンプルコードにあるように、Format関数でスラッシュを入れてあげると大丈夫。
(Format関数の引数は “yyyy/mm/dd”ではなく”####/##/##”なのでご注意)
こちらのコードは、下記のサイトを参考にさせていただきました。
[ VBA ] 有効な日付か妥当性を検証する ( IsDate 関数 ) | 行け!偏差値40プログラマー
終わりに
「ハイフンはいいけど、ピリオドとか連続8ケタ表記はだめなんですよ」と、どこかにはっきり書いてあるかと思ったら、どこにも書いてないので驚きました。
これは常識の範囲だということなのでしょうか!?!?
VBAのレッスンをするために細部を点検していて、この点気が付いて掘り下げていたのですが、教室では到底これを「常識」「エクセル使ってれば分かるよね?」とは言えない、と思いました。当教室ではちゃんとテキストに差し込みで紙を一枚入れて教えることにします。
コメント