2017-07-19 10 views
1

ワークシートの変更イベントでこのコードスニペットを使用していますが、そのように発射する必要はありません。VBAでケースステートメントが正しく動作していない理由がわかりません

If Not Intersect(Target, rng6) Is Nothing Then 

     Select Case IsDate(Target.Value) 
     Case False 
     Target.NumberFormat = "m/yyyy" 
     Target = Empty 
     Case True 

      If Format(Target.Value, "m/yyyy") < Format(Now, "m/yyyy") Then 
      MsgBox "Must not be less than" & vbLf & "current month & year !", vbExclamation, "Warning.." 
      Target.Value = Format(Now, "m/yyyy") 
      Else 
      Target.NumberFormat = "m/yyyy" 
      MsgBox Format(Target.Value, "m/yyyy") & " " & Format(Now, "m/yyyy") 
      End If 

     End Select 

    End If 

FALSEセクションは正しく機能していますが、TRUEになり、ifステートメントを実行すると、どちらか一方のみが返されます。

たとえば、私は01/2017の入力をテストし、IFの最初の部分を返しますが、10/2017に入力すると、最初の部分ALSOが返され、今日のM/YYYYに変換されます。今日のm/yyyyは今日のm/yyyよりも大きいので、それはすべきです。

エラーが何であるかは誰でも確認できますか? /あなたがいないNowで、Dateで今日の日付を取得する必要があり

おかげ

+1

に私はあなたのフォーマットを使用して日付を比較していないお勧めしますが、DateDiff関数を使用して。 –

+1

単純な 'if'文がするときに' Select Case'を使うのはなぜですか? – FunThomas

+0

なぜブール値の2つの可能な値すべてをチェックするために 'Select Case'を使用していますか? If IsDate(Target.Value)... Else ... End Select'のような何かをするだけですか? @FunThomasあなたはもっと速かったです... – deHaar

答えて

0

私はそれが簡単だと確信していると解決策はすぐそこです。これらの2つの違いを確認してください。

日付を比較するときにフォーマットする必要はありません。そして、あなたの日付に応じて、あなたには、いくつかの追加の調整を行う必要がある場合があります。したがって、このようにしてみてください:VBA/Excelが日付を比較すると

If DateSerial(year(target),Month(target),day(target)) < Date Then 

、それは単に彼らの長い数字を比較します。フォーマットは、どのように表示されるかを知るためにのみ使用されます。

たとえば、今日の日付は42935、昨日は42934でした。この値は、直接ウィンドウに?clng(Date)と書いてください。

+0

このビットの情報に感謝します! –

1

だけDateDiffの使用を説明する:前今月0、来月から正

If Not Intersect(Target, rng6) Is Nothing Then 
    Select Case IsDate(Target.value) 
    Case False 
     Target.NumberFormat = "m/yyyy" 
     Target = Empty 
    Case True 
     If DateDiff("m", Target.value, Now) > 0 Then 
      MsgBox "Must not be less than" & vbLf & "current month & year !", vbExclamation, "Warning.." 
      Target.value = Format(Now, "m/yyyy") 
     Else 
      Target.NumberFormat = "m/yyyy" 
      MsgBox Format(Target.value, "m/yyyy") & " " & Format(Now, "m/yyyy") 
     End If 
    End Select 
End If 

DateDiff("m", Target.value, Now)意志否定。

編集:あなたはDateまたはNow(月/年のためにのみチェック)を使用している場合は、「M」とのDateDiff関数は気にしないことに注意してください

+0

ありがとう、これは良い解決策です! –

関連する問題