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になるようにできると思います

実行結果は右図の通りです。