2016-06-01 12 views
0

誰もがmm/dd/yyyyの形式で日付フォーマットを検証する方法を知っています。 私はこのコードを試しましたが、動作していません。モジュールでは日付フォーマットを検証

dateCheck (txtStartDate) 

:ユーザーフォームで

Function dateCheck(dateValue As Date) As Boolean 
    If CDate(dateValue) <> "mm/dd/yyyy" Then 
     MsgBox "Please use the mm/dd/yyyy date format!" 
     dateCheck = True 
    End If 
End Function 

が、私は正しい軌道に乗っていますか?ありがとう!

+0

あなたは[VBA機能](https://msdn.microsoft.com/en-us/library/office/gg278584%28v=office.15%29.aspx) 'IsDate'を知っていますか? – Ralph

+0

はい、私はそれを認識しています。 – kruk22

+0

ユーザーは2016年1月5日を意味する05/01/2016を入力できますが、ユーザーフォームは2016年5月1日と解釈されます。すべての異常を避け、ユーザーが好きな形式で入力できるようにしますが、入力された日付を常に「dd-mmm-yyyy」形式に変更します。 Excelはローカライズされた形式を認識し、それに従って適切な形式に変更することができます。 – Rosetta

答えて

1

CDate(dateValue)の関数の一部は、単に 'dateValue'をDateとして返します。フォーマットを取得するには.Numberformatプロパティを使用してください:

Function dateCheck(dateValue As Date) As Boolean 
    If dateValue.NumberFormat <> "mm/dd/yyyy" Then 
     MsgBox "Please use the mm/dd/yyyy date format!" 
     dateCheck = True 
    End If 
End Function 
+0

OPはフォームの使用を述べました。あなたがOPが彼/彼女のフォームで使用しているコントロールの上で '.NumberFormat'が利用できることは確かですか? – Ralph

+0

私はすでにそれを試みました。それは言う:無効な修飾子。 – kruk22

0

問題は複雑です。あなたの質問には実際に2つのステップがあります:

  1. txtStartDateは実際に有効な日付ですか?
  2. 日付であれば、正しくフォーマットされていますか?

txtStartDateの名前は、日付を(フォームで)テキストとして取得していることを意味します。しかし、txtStartDateが実際に日付であるという前提で、関数に渡しています。これは、関数dateCheckが日付を期待しているので明らかになります:Function dateCheck(dateValue As Date) As Boolean

だから、ここ一度に両方を解決するためのソリューション提案です:

Sub tmpTest() 

Dim txtStartDate As String 

txtStartDate = "11/20/2015" 

Debug.Print dateCheck(txtStartDate) 

End Sub 

Function dateCheck(dateValue As String) As Boolean 

If IIf(IsDate(txtStartDate), Format(CDate(txtStartDate), "mm/dd/yyyy"), "") = dateValue Then dateCheck = True 

End Function 

が、これは国際的な日付形式のために動作しません非常に単純なアプローチであることに留意してください。実際には、私はあなたの日付形式を持っていないので、少し調整する必要があります。より洗練されたものが必要な場合は、VBAコード(広範な検証機能を含む)をもう少し書く必要があります。

+0

はい、これは、ユーザーが有効な日付を入力した場合に機能します。しかし、そうでなければエラーを返します。 On error Resume Next Statementを使用してエラーを処理することはできますか?しかし、私はそれを暗示する方法を知らない。それは私の考えです。 – kruk22

+0

この関数は常に、エラーではなく、 'True'または' False'を返します。少なくとも私はここにいるのです。しかし、私は上記が非常に単純なアプローチであり、多くのケースをカバーしていないことを認識しています。国際日付フォーマットやその他の便利な機能を含む洗練された日付検証機能を作成する(例えば、05/19は自動的に '05/19/2016'に、-7は自動的に日付1に戻ります週前)は、VBAコーディングがさらに必要になります。 – Ralph

+0

国際化のために '' mm/dd/yyyy ""の代わりに '' mm \/dd \/yyyy "'を '' Format'の引数として使うことができます。それは '/'を強制します。私のシステムでは、 '' mm/dd/yyyy "'を使うと、 '' Format'は '/'を '.'で置き換えます(これはimoを行うのに悪いことです)。 – arcadeprecinct

0
Function dateCheck(dateStrng As String) As Boolean 
Dim dateArr as Variant 

If IsDate(dateStrng) Then ' <~~ if it IS a date 
    dateArr = Split(dateStrng,"/") 
    If UBound(dateArr) = 2 Then '<~~ if it has three substrings separate by two "slashes" 
     If CInt(dateArr(0)) < 13 Then '<~~ if the 1st number is lower or equals the maximum possible month number 
     If CInt(dateArr(0)) > 0 Then '<~~ if the 1st number is higher or equals the mimimum possible month number 
      If CInt(dateArr(1)) < 31 Then '<~~ if the 2nd number is lower or equals the maximum possible day number 
       If CInt(dateArr(1)) > 0 Then '<~~ if the 2nd number is higher or equals the mimimum possible day number 
        If CInt(dateArr(2)) < 10000 Then dateCheck = CInt(dateArr(2)) > 999 '<~~ if the 3rd number is a 4 digit integer "year" number, then check returns True 
       End If 
      End If 
     End If 
     End If 
    End If 
End Function 
+0

@ kruk22:これを試しましたか? – user3598756

+0

@ kruk22:あなたのお手伝いをしようとすると、フィードバックが寄せられます。 – user3598756

0

dateCheck関数がこのトピックで尋ねられた質問から正しくありません。この機能の問題は、2011年1月12日または12/1/2017を正しく識別できないことです。

dateCheckはISDATEのような作品()です。

-2

dateCheck機能は、このトピックに尋ねた質問から正解ではありません。この機能の問題は、2011年1月12日または12/1/2017を正しく識別できないことです。

関連する問題