我在工作表更改事件中有这段代码,但它没有像它应该的那样触发。
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月10日输入时,它返回第一部分ALSO并将其转换为今天的M / YYYY,而不是第二部分,因为当前的m / yyyy大于今天&#39; sm / yyy。
任何人都可以识别出错误是什么吗?我确定它很简单,解决方案就在那里/
由于
答案 0 :(得分:1)
仅用于说明DateDiff的使用:
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)
将从下个月开始为负,本月为0,之前为正。
编辑:请注意,如果您使用Date
或Now
(仅检查月/年),则DateDiff与“m”无关紧要
答案 1 :(得分:0)
您需要使用Date
获取今天的日期,而不是使用Now
。看看这两者之间的区别:
Public Sub TestMe()
Debug.Print DateDiff("d", Date, Now)
Debug.Print DateDiff("h", Date, Now)
Debug.Print DateDiff("m", Date, Now)
End Sub
比较时,您无需格式化日期。根据您的日期,您可能需要做一些额外的调整:因此尝试这样:
If DateSerial(year(target),Month(target),day(target)) < Date Then
当VBA / Excel比较日期时,它只是比较它们的长数。该格式仅用于了解它的显示方式。
例如,今天的日期是42935
,昨天是42934
。您可以通过在即时窗口中编写?clng(Date)
来获得此值。