Excel 2010 VBAで使用する[IsDate]関数は与えられた文字列が日付形式かどうかを返してくれる関数です。
通常は問題ないのですが、先日変な現象に遭遇しました。
下記のプログラムを見てください。
ublic Function test_IsDate(buf As Variant) As Variant
test_IsDate = IIf(IsDate(buf), "[" & buf & "]は日付です。", _
"[" & buf & "]は日付ではありません。")
End Function
Public Sub test()
MsgBox "1." & test_IsDate("2011/11/30") & vbCrLf _
& "2." & test_IsDate("2011/11") & vbCrLf _
& "3." & test_IsDate("11/3") & vbCrLf _
& "4." & test_IsDate("12/32") & vbCrLf _
& "5." & test_IsDate("00A") & vbCrLf _
& "6." & test_IsDate("00") & vbCrLf _
& "7." & test_IsDate("0A") & vbCrLf _
& "8." & test_IsDate("A") & vbCrLf _
, vbOKOnly + vbInformation, "IsDateテスト"
End Sub
どんな結果になるか、想像できますよね、
testを実行した結果は右図の通り。想像した結果と違っていたのではないでしょうか?
4.5.7.はどう見たっておかしいですよね。 原因についてはわかりませんが、日付ではない一般の文字列を渡すことは避けたほうがいいようです。
というわけで、自前のMyIsDateプロシージャを作ってみました。 ( http://kozhouse.homeip.net/progtec/11/ を参考にさせて頂きました。)
Exit Function
End If
End If
Else
nDay = CLng(sDay)
End If
End If
Select Case nMonth
Case 1, 3, 5, 7, 8, 10, 12
nDayMax = 31
Case 4, 6, 9, 11
nDayMax = 30
Case 2
nDayMax = 28 - ((nYear Mod 400) = 0) + ((nYear Mod 100) = 0) - ((nYear Mod 4) = 0)
Case Else
Exit Function
End Select
If cntr = 2 Then '年/月/日
If (nDay >= 1) And (nDay <= nDayMax) Then
MyIsDate = True
End If
Else
MyIsDate = True
End If
End Function
仕様的には、
基本形 年/月/日 時:分:秒
OK 年/月/日
OK 月/日
OK 年/月/日 時:分:秒
NG 年/月 時:分:秒
NG 月/日 時:分:秒 ← 少し拡張すれば、OKになるようにできると思います
実行結果は右図の通りです。